2008-09-24 7 views
50

मेरे पास एक कोड है जो एक वेब सेवा का संदर्भ देता है, और मैं उस वेब सेवा का पता गतिशील होना चाहता हूं (डेटाबेस, कॉन्फ़िगरेशन फ़ाइल, आदि से पढ़ें) ताकि यह आसानी से बदला जा सके। इसका एक बड़ा उपयोग कई वातावरणों पर तैनात करना होगा जहां मशीन नाम और आईपी पते अलग-अलग होंगे। वेब सेवा हस्ताक्षर सभी तैनाती में समान होगा, बस कहीं और स्थित है।मैं बिना किसी प्रतिकृति के .NET में वेब सेवा पतों को गतिशील रूप से कैसे बदल सकता हूं?

शायद मैं विजुअल स्टूडियो "वेब संदर्भ जोड़ें" विज़ार्ड द्वारा खराब हो गया है - ऐसा लगता है कि यह अपेक्षाकृत आसान कुछ होना चाहिए।

+0

क्या आप विजुअल स्टूडियो 2005 या 2008 का उपयोग कर रहे हैं। मेरा मानना ​​है कि विज़ार्ड प्रत्येक में थोड़ा अलग हैं। –

उत्तर

49

जब आप कोई वेब संदर्भ उत्पन्न करते हैं और समाधान एक्सप्लोरर में वेब संदर्भ पर क्लिक करते हैं। गुण में फलक आप कुछ इस तरह देखना चाहिए:

Web Reference Properties

गतिशील करने के लिए मान का बदलना अपने app.config में एक प्रविष्टि डाल देंगे।

यहां CodePlex article है जिसमें अधिक जानकारी है।

+1

जब मैं इसे प्रकाशित करता हूं तो app.config कहां जाता है। मैं इसे प्रकाशित आउटपुट निर्देशिका – Shyju

+2

में नहीं देख सकता, इसका नाम बदलकर [आउटपुटएस्परनाम] .config कर दिया जाएगा। उदाहरण: MyProject।exe.config –

+2

कुछ स्थितियों में नीचे ब्रैड ब्रूस का उत्तर कहीं अधिक उपयोगी है - आप वेब सेवा ऑब्जेक्ट की यूआरएल संपत्ति बदल सकते हैं। – SAJ14SAJ

2

यदि आप किसी डेटाबेस से यूआरएल ला रहे हैं तो आप मैन्युअल रूप से इसे वेब सेवा प्रॉक्सी क्लास यूआरएल संपत्ति में असाइन कर सकते हैं। यह वेब विधि को कॉल करने से पहले किया जाना चाहिए।

यदि आप कॉन्फ़िगरेशन फ़ाइल का उपयोग करना चाहते हैं, तो आप प्रॉक्सी क्लासेस URL व्यवहार को गतिशील में सेट कर सकते हैं।

4

जब तक वेब सेवा विधियों और अंतर्निहित खुला कक्षाएं नहीं बदलती हैं, यह काफी मामूली है। विजुअल स्टूडियो 2005 (और नए) के साथ, एक वेब संदर्भ जोड़ने से यह app.config (या web.config, वेब ऐप्स के लिए) अनुभाग बनाता है जिसमें यह URL है। आपको बस वांछित यूआरएल को प्रतिबिंबित करने के लिए app.config फ़ाइल को संपादित करना है।

हमारी परियोजना में, हमारा सरल दृष्टिकोण केवल एप.कॉन्फिग प्रविष्टियों ने प्रति पर्यावरण प्रकार (विकास, परीक्षण, उत्पादन) पर टिप्पणी की थी। इसलिए हम वांछित पर्यावरण प्रकार के लिए प्रविष्टि को असम्बद्ध करते हैं। वहां कोई विशेष कोडिंग की आवश्यकता नहीं है।

2

स्थिर और गतिशील के बीच अंतर के बारे में बस एक नोट।

  • स्टेटिक: आप URL संपत्ति हर बार जब आप वेब सेवा को कॉल सेट करना होगा। इसका कारण यह है कि यदि वेब सेवा प्रॉक्सी क्लास कन्स्ट्रक्टर में है तो बेस यूआरएल।
  • गतिशील: आपके web.config फ़ाइल में आपके लिए एक विशेष कॉन्फ़िगरेशन कुंजी बनाई जाएगी। डिफ़ॉल्ट प्रॉक्सी क्लास द्वारा इस कुंजी से यूआरएल पढ़ा जाएगा।
25

यदि आप वास्तव में इसे गतिशील रूप से सेट कर रहे हैं, तो आपको प्रॉक्सी क्लास के उदाहरण के यूआरएल फ़ील्ड को सेट करना चाहिए।

अपने कार्यक्रम के भीतर से .config फ़ाइल में मूल्य निर्धारित करना:

  1. एक मेस है;

  2. अगले आवेदन शुरू होने तक पढ़ा नहीं जा सकता है।

यदि यह केवल कुछ है कि एक बार स्थापना प्रति किया जाना चाहिए है, मैं अन्य पोस्टर के साथ सहमत हैं और .config फ़ाइल और गतिशील सेटिंग का उपयोग करें चाहते हैं।

+9

उदाहरण के लिए। 'var api = new MyApi.Service(); api.Url = "http://yetanotherurl.com"; ' –

+0

यही वह है जो मैंने किया है लेकिन उत्पादन पर लिंक नहीं बदला जाता है, यह अभी भी पुराना है .. – dawncode

1

निश्चित रूप से यूआरएल संपत्ति का उपयोग करने का तरीका है। इसे app.config में सेट करना है, डेटाबेस, या तीसरा स्थान प्रकार आपकी कॉन्फ़िगरेशन आवश्यकताओं पर निर्भर करता है। कभी-कभी आप नहीं चाहते हैं कि जब आप वेब सेवा स्थान बदलते हैं तो ऐप को पुनरारंभ करना होगा। आपके पास बैकएंड स्केलिंग लोड बैलेंसर नहीं हो सकता है। आप वेब सेवा बग को गर्म-पैचिंग कर सकते हैं। आपके कार्यान्वयन में सुरक्षा कॉन्फ़िगरेशन समस्याएं भी हो सकती हैं। चाहे यह उत्पादन डीबी उपयोगकर्ता नाम और पासवर्ड या यहां तक ​​कि ws सुरक्षा लेख जानकारी है। कर्तव्यों का उचित पृथक्करण आपको कुछ और शामिल कॉन्फ़िगरेशन सेटअप में प्राप्त कर सकता है।

यदि आप प्रॉक्सी जेनरेटेड कक्षाओं के चारों ओर एक रैपर वर्ग जोड़ते हैं, तो आप वेब विधि को कॉल करने के लिए प्रत्येक बार जब आप रैपर क्लास बनाते हैं तो आप कुछ एकीकृत फैशन में यूआरएल प्रॉपर्टी सेट कर सकते हैं।

4

मैंने कुछ दिनों के लिए इस मुद्दे के साथ संघर्ष किया है और आखिरकार प्रकाश बल्ब पर क्लिक किया गया। रनटाइम पर किसी webservice के URL को बदलने में सक्षम होने के लिए कुंजी कन्स्ट्रक्टर को ओवरराइड कर रहा है, जिसे मैंने आंशिक श्रेणी घोषणा के साथ किया था। उपर्युक्त, यूआरएल व्यवहार को डायनामिक में सेट करना भी किया जाना चाहिए।

यह मूल रूप से एक वेब-सेवा रैपर बनाता है जहां आपको सेवा बिंदु संदर्भ के माध्यम से किसी भी समय वेब सेवा को फिर से लोड करना होता है, तो आप अपना काम नहीं हटाते हैं। आंशिक कक्षाओं के लिए माइक्रोसॉफ्ट सहायता विशेष रूप से बताती है कि इस निर्माण के कारण का हिस्सा वेब सेवा रैपर बनाना है। http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.100).aspx

// Web Service Wrapper to override constructor to use custom ConfigSection 
// app.config values for URL/User/Pass 
namespace myprogram.webservice 
{ 
    public partial class MyWebService 
    { 
     public MyWebService(string szURL) 
     { 
      this.Url = szURL; 
      if ((this.IsLocalFileSystemWebService(this.Url) == true)) 
      { 
       this.UseDefaultCredentials = true; 
       this.useDefaultCredentialsSetExplicitly = false; 
      } 
      else 
      { 
       this.useDefaultCredentialsSetExplicitly = true; 
      } 
     } 
    } 
} 
0

खुला solition एक्सप्लोरर

सही वेब सेवा URL बदलें व्यवहार गतिशील के लिए क्लिक करें

'शो सभी फाइलों को' समाधान एक्सप्लोरर

में आइकन पर क्लिक करें वेब संदर्भ संपादित संदर्भ में .cs फ़ाइल

बदलें कन्स्ट्रक्टर

public Service1() { 
     this.Url = "URL"; // etc. string variable this.Url = ConfigClass.myURL 
     } 
0

मेरे लिए एक WebService करने के लिए एक संदर्भ एक

सेवा संदर्भ

है।

वैसे भी यह बहुत आसान है। जैसा कि किसी ने कहा था, आपको बस web.config फ़ाइल में यूआरएल बदलना होगा।

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="YourServiceSoap" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     **** CHANGE THE LINE BELOW TO CHANGE THE URL **** 
     <endpoint address="http://10.10.10.100:8080/services/YourService.asmx" 
      binding="basicHttpBinding" bindingConfiguration="YourServiceSoap" 
      contract="YourServiceRef.YourServiceSoap" name="YourServiceSoap" /> 
    </client> 
6

मुझे पता है कि यह एक पुराना सवाल है, लेकिन हमारा समाधान जो मैं यहां देखता हूं उससे कहीं अधिक सरल है। हम इसे वीएस 2010 और ऊपर के साथ डब्ल्यूसीएफ कॉल के लिए उपयोग करते हैं। स्ट्रिंग यूआरएल ऐप सेटिंग्स या किसी अन्य स्रोत से आ सकता है। मेरे मामले में यह एक ड्रॉप डाउन सूची है जहां उपयोगकर्ता सर्वर चुनता है। सेवा को वीएस एड सेवा संदर्भ के माध्यम से कॉन्फ़िगर किया गया था।

private void CallTheService(string url) 
{ 
    TheService.TheServiceClient client = new TheService.TheServiceClient(); 
    client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url); 
    var results = client.AMethodFromTheService(); 
} 
+0

अच्छा, यह सबसे आसान लग रहा था समाधान और एक एएसएमएक्स वेब सेवा पर भी मेरे लिए काम किया। – germankiwi

संबंधित मुद्दे

 संबंधित मुद्दे