2010-09-13 15 views
31

पर भरोसा किए बिना एक एसओएपी वेब सेवा का उपभोग करें। मैं एक .NET घटक बना रहा हूं जो बाहरी वेब सेवा को कॉल करेगा। मैंने अपने घटक में वेब सेवा जोड़ने के लिए "सेवा जोड़ें संदर्भ" संवाद का उपयोग किया, जो सेवा का उपभोग करने के लिए आवश्यक कोड उत्पन्न करता है और सेटिंग्स को app.config फ़ाइल में जोड़ता है।app.config

मैं कंसोल एप्लिकेशन से अपने डीएलएल का संदर्भ जोड़कर घटक की जांच कर रहा हूं और उचित विधि को कॉल कर रहा हूं जो वेब सेवा का एक नया उदाहरण बनाता है: ... = new MyServiceSoapClient()। हालांकि, जब मैं यह कर, मैं निम्नलिखित अपवाद:

InvalidOperationException

डिफ़ॉल्ट endpoint तत्व का संदर्भ देता है अनुबंध 'MyServicesSoap' ServiceModel ग्राहक विन्यास खंड में नहीं मिल सका। ऐसा इसलिए हो सकता है क्योंकि आपके एप्लिकेशन के लिए कोई कॉन्फ़िगरेशन फ़ाइल नहीं मिली है, या क्योंकि इस अनुबंध से मेल खाने वाला कोई एंडपॉइंट तत्व क्लाइंट तत्व में नहीं पाया जा सकता है।

यह समझ में आता है क्योंकि app.config को घटक के डीएलएल के साथ लाया नहीं जा रहा है। मैं App.Config में सेटिंग्स पर भरोसा किए बिना वेब सेवा कैसे कॉल कर सकता हूं?

+0

डब्ल्यूसीएफ वेब सेवा उदाहरण बनाते समय [अवैध ऑपरेशन अपवाद] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/24993/invalidoperationexception-after-creating-wcf-web-service-instance) –

+0

संक्षेप में: उन कॉन्फ़िगरेशन सेटिंग्स घटक से ConsoleApplication1.exe पर कॉपी करने की आवश्यकता है।कॉन्फ़िगर –

+0

@ जोश जो मेरे मामले में काम नहीं करेगा। मैंने अपने प्रश्न में इसका जिक्र नहीं किया, लेकिन यह .NET DLL को वीबी 6 कॉम एप्लिकेशन से बुलाया जा रहा है, इसलिए जो .NET घटक मैं लिख रहा हूं उसे किसी भी चीज़ पर भरोसा किए बिना वेब सेवा को सफलतापूर्वक कॉल करने में सक्षम होना चाहिए उपभोग करने वाले आवेदन से। –

उत्तर

65

app.config फ़ाइल में <system.ServiceModel> में सेटिंग्स बाहरी वेब सेवा से कनेक्ट करने के लिए घटक को बताएगी। एक्सएमएल वेब सेवा के लिए डिफ़ॉल्ट कनेक्शन बनाने के लिए जरूरी आवश्यक वर्गों और गणनाओं का एक पाठ्य प्रतिनिधित्व है।

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="MyServicesSoap" closeTimeout="00:01:00" openTimeout="00:01:00" 
    receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
    useDefaultWebProxy="true"> 
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
     realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
    </security> 
    </binding> 
    </basicHttpBinding> 
    </bindings> 
<client> 
    <endpoint address="http://services.mycompany.com/WebServices/MyServices.asmx" 
    binding="basicHttpBinding" bindingConfiguration="MyServicesSoap" 
    contract="MyServices.MyServicesSoap" name="MyServicesSoap" /> 
</client> 
</system.serviceModel> 

यह अनुवाद किया जा सकता है ताकि तरह कोड करने के लिए:

उदाहरण के लिए, इस कोड है कि वेब सेवा है कि मैं जोड़ा के लिए उत्पन्न की गई है

'Set up the binding element to match the app.config settings ' 
    Dim binding = New BasicHttpBinding() 
    binding.Name = "MyServicesSoap" 
    binding.CloseTimeout = TimeSpan.FromMinutes(1) 
    binding.OpenTimeout = TimeSpan.FromMinutes(1) 
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10) 
    binding.SendTimeout = TimeSpan.FromMinutes(1) 
    binding.AllowCookies = False 
    binding.BypassProxyOnLocal = False 
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard 
    binding.MaxBufferSize = 65536 
    binding.MaxBufferPoolSize = 524288 
    binding.MessageEncoding = WSMessageEncoding.Text 
    binding.TextEncoding = System.Text.Encoding.UTF8 
    binding.TransferMode = TransferMode.Buffered 
    binding.UseDefaultWebProxy = True 

    binding.ReaderQuotas.MaxDepth = 32 
    binding.ReaderQuotas.MaxStringContentLength = 8192 
    binding.ReaderQuotas.MaxArrayLength = 16384 
    binding.ReaderQuotas.MaxBytesPerRead = 4096 
    binding.ReaderQuotas.MaxNameTableCharCount = 16384 

    binding.Security.Mode = BasicHttpSecurityMode.None 
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None 
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None 
    binding.Security.Transport.Realm = "" 
    binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName 
    binding.Security.Message.AlgorithmSuite = Security.SecurityAlgorithmSuite.Default 

    'Define the endpoint address' 
    Dim endpointStr = "http://services.mycompany.com/WebServices/MyServices.asmx" 
    Dim endpoint = New EndpointAddress(endpointStr) 
    'Instantiate the SOAP client using the binding and endpoint' 
    'that were defined above' 
    Dim client = New MyServicesSoapClient(binding, endpoint) 

आमतौर पर, जब आप का उपयोग करें पैरामीटर रहित कन्स्ट्रक्टर (यानी new MyServicesSoapClient()), app.config फ़ाइल में सेटिंग्स का उपयोग किया जाएगा। हालांकि, आप कोड में मानों को binding और endpoint मानों को स्पष्ट रूप से सेट करके और उन उदाहरणों को कन्स्ट्रक्टर में पास करके app.config फ़ाइल को बाईपास कर सकते हैं।

+1

+1 ग्रेट, इसके लिए धन्यवाद। हालांकि मुझे लगता है कि बाध्यकारी पर मुझे केवल एक मिनीियम मात्रा की सेटिंग्स जोड़ने की आवश्यकता है। मैंने बाइंडिंग पर केवल टाइमआउट का इस्तेमाल किया और यह ठीक हो गया। – Deano

+0

मुझे एक वीबी 6 एप्लिकेशन के साथ समस्याएं थीं जिसमें एक .NET डीएल संदर्भित किया गया था जिसे वेब सेवा कहा जाता था। डीएलएल की एप.कॉन्फिग फ़ाइल से परेशानी की समस्या, डीएलएस से कॉन्फ़िगरेशन फाइलों को पढ़ने के रूप में पूरी तरह से सीधा नहीं है, और इससे मुझे कॉन्फ़िगरेशन फ़ाइल को पूरी तरह से बाईपास करने की अनुमति मिली है। – RoastBeast

+0

अन्य विशेषताओं के बारे में क्या? –

-1

यदि यह एक डब्ल्यूसीएफ सेवा है (जो यह त्रुटि संदेशों से लगता है), तो, अधिकांश भाग के लिए, आपको app.config की आवश्यकता होगी, क्योंकि यह app.config है जो बताता है WCF कि MyServiceSoapClient है एक वेब सेवा के बाकी (दो app.config फ़ाइलों में कुछ बदलाव करने के साथ, यह एक नामित पाइप सेवा बन सकता है, कोड recompiling बिना ....)

अब, अगर आप वास्तव में app.config के बिना ऐसा करना चाहते हैं, तो आपको HttpWebRequest पर आधारित, MyServiceSoapClient() उत्पन्न करना होगा, और अपना खुद का लिखें।

0

कोड में बाइंडिंग और Endpoint विन्यास की स्थापना एक ही रास्ता है, लेकिन एक और तरीका उपभोक्ता DLL का उपयोग करें और मौजूदा App.config फ़ाइल में विन्यास रहने देना है।

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

जब हम ग्राहक घटक करने के लिए वेब सेवा को जोड़ने और वेब सेवा का उदाहरण बनाने के लिए "सेवा संदर्भ जोड़ें" संवाद का उपयोग करें, हम दृश्य स्टूडियो संचार चैनल के निर्माण को संभालने और विन्यास setting.So लोड, अगर जाने हम इस तरह के चैनल को स्पष्ट रूप से अपने स्वयं के बनाने में सक्षम हैं तो हम कॉन्फ़िगरेशन सेटिंग्स का प्रबंधन कर सकते हैं।

माइक्रोसॉफ्ट इस उद्देश्य के लिए कक्षाएं प्रदान करता है, ConfigurationChannelFactory<TChannel> कक्षा एक है। एमएसडीएन कहता है:

विशिष्ट प्रकार के लिए चैनल कॉन्फ़िगरेशन तत्व बनाने के लिए सामान्य कार्यक्षमता प्रदान करता है।

ConfigurationChannelFactory WCF क्लाइंट कॉन्फ़िगरेशन के केंद्रीय प्रबंधन की अनुमति देता है।

उपयोग "सेवा संदर्भ जोड़ें" संवाद ग्राहक घटक करने के लिए वेब सेवा जोड़ने के लिए के रूप में हम सेवा चैनल इंटरफ़ेस उदाहरण की जरूरत है।

प्रथम नाम बदलने उत्पन्न App.config फ़ाइल App.dll.config करने और उसके फ़ाइल गुण आउटपुट निर्देशिका के लिए कॉपी बदलनेकॉपी करने के लिए संपत्ति हमेशा

बनाएं में एक वर्ग जिसमें एक विधि है जो वेब ऑब्जेक्ट को वेब सेवा तक पहुंचने के लिए चैनल ऑब्जेक्ट देता है:

public class ManageService 
{ 
    public static T CreateServiceClient<T>(string configName) 
    { 
     string _assemblyLocation = Assembly.GetExecutingAssembly().Location; 
     var PluginConfig = ConfigurationManager.OpenExeConfiguration(_assemblyLocation); 
     ConfigurationChannelFactory<T> channelFactory = new ConfigurationChannelFactory<T>(configName, PluginConfig, null); 
     var client = channelFactory.CreateChannel(); 
     return client; 
    } 
} 

चूंकि हमने संपत्ति सेट की है, हमेशा वीएस परियोजना प्रोजेक्ट डीएलएल के साथ-साथ App.dll.config को बिन फ़ोल्डर में कॉपी करता है। Assembly.GetExecutingAssembly().Location विधानसभा स्थान लौटने और ConfigurationManager.OpenExeConfiguration

एक विन्यास वस्तु के रूप में निर्दिष्ट ग्राहक विन्यास फाइल को खोलता है।

PluginConfig app.config विन्यास फाइल वस्तु रखती है और ConfigurationChannelFactory<T> इसे इस्तेमाल करता है सेवा के साथ संवाद करने।

इस विधि इस तरह से अपनी सेवा चैनल इंटरफ़ेस ऑब्जेक्ट पारित करके कहा जा सकता है:

Client = ManageService.CreateServiceClient<SampleService.IKeyServiceChannel>("MetadataExchangeTcpBinding_IKeyService"); 

SampleService अपने वेब सेवा के नाम स्थान है। Client वेब सेवा का उदाहरण रखता है।

यदि आपको डुप्लेक्स संचार और कॉलबैक को संभालने की आवश्यकता है, तो आप ConfigurationDuplexChannelFactory<TChannel> कक्षा देख सकते हैं।