2009-05-07 22 views
10

मेरे पास एक डब्ल्यूसीएफ सेवा है जो ठीक है, अगर मैं किसी बाध्यकारी या एंडपॉइंट को निर्दिष्ट किए बिना सेवा बनाता हूं (यह ऐप.कॉन्फिग में जेनरेट किए गए मानों से इसे पढ़ता है जब मैंने विजुअल स्टूडियो के माध्यम से डब्ल्यूसीएफ पंजीकृत किया है)।डब्ल्यूसीएफ: मैं इन App.config मानों को प्रोग्रामेटिक रूप से फिर से कैसे बना सकता हूं?

return new SmsServiceReference.SmsEngineServiceClient(); 

यह ठीक काम करता है (क्योंकि मूल्यों config से पढ़ा जाता है):

मैं एक सरल विधि है कि सेवा संदर्भ देता है। हालांकि, मैं एक डाटाबेस (उदाहरण के लिए यूआरआइ) में इन मूल्यों के कुछ करना चाहते हैं और कुछ इस तरह करना चाहते हैं:

 Binding binding = new BasicHttpBinding(); 
     EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

यह काम नहीं करता। जब मैं सेवा संदर्भ का उपयोग करने का प्रयास करता हूं तो यह एक अपवाद फेंकता है।

मुझे संदेह है कि ऐसा इसलिए है क्योंकि मेरे App.config में अधिक जानकारी है कि वहां दो पंक्तियां उपलब्ध नहीं हैं (जाहिर है)। सवाल यह है कि, मैं निम्नलिखित ऐप को दोहरा सकता हूं। प्रोग्राम मूल्यों को कॉन्फ़िगर करें?

यहां मेरे ऐप का खंड है। कॉन्फिग: (यूआरआई को मासूम की रक्षा के लिए बदला गया है)।

<endpoint address="http://www.myuri.com/Services/Services.svc/basic" 

लेकिन अपने कोड नमूने में, आपके द्वारा बनाए गए:

EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

पतों से मेल खाना चाहिए

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_ISmsEngineService" 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://www.myuri.com/Services/Services.svc/basic" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService" 
     contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" /> 
</client> 

उत्तर

16

अनुप्रयोग config में मूल्यों से अधिकांश को भी बंधन में गुण हैं और प्रोग्राम के निर्मित किया जा सकता है। व्यक्तिगत रूप से, मैं एक विधि का उपयोग करें नीचे दिए गए एक बाध्यकारी

 

public static BasicHttpBinding CreateBasicHttpBinding() 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(); 
      binding.AllowCookies = false; 
      binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
      binding.OpenTimeout = new TimeSpan(0, 1, 0); 
      binding.SendTimeout = new TimeSpan(0, 1, 0); 
      // add more based on config file ... 
      //buffer size 
      binding.MaxBufferSize = 65536; 
      binding.MaxBufferPoolSize = 534288; 
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 

      //quotas 
      binding.ReaderQuotas.MaxDepth = 32; 
      binding.ReaderQuotas.MaxStringContentLength = 8192; 
      // add more based on config file ... 

      return binding; 
     } 
 

बनाने के लिए इस तरह के रूप और मैं अपने Endpoint पते बनाने के लिए कुछ इस तरह का उपयोग

 

public static EndpointAddress CreateEndPoint() 
     { 
      return new EndpointAddress(Configuration.GetServiceUri()); 
     } 
 

serviceUri सेवा URL होगा जैसे http://www.myuri.com/Services/Services.svc/basic

अंत में सेवा ग्राहक

 

Binding httpBinding = CreateBasicHttpBinding(); 
EndpointAddress address = CreateEndPoint(); 
var serviceClient = new MyServiceClient(httpBinding, address); 
 
+0

यह चाल है। धन्यवाद। –

1

ठीक है, config में ग्राहक endpoint इस URL निर्दिष्ट करता है - अगर कॉन्फ़िगर में कोई काम करता है, तो आपको अपना कोड बदलना होगा:

EndpointAddress endpointAddress = new EndpointAddress("http://www.myuri.com/Services/Services.svc/basic"); 

मन आप - आपके कोड नमूने (my.uri.com बनाम www.myuri.com, /service.svc /Services/Services.svc के बजाय) में विभिन्न छोटे से ग़लतियां नहीं हैं।

क्या यह सही एंडपॉइंट पते के साथ काम करता है?

मार्क

+0

मैं के लिए माफी माँगता हूँ बनाने के लिए "छोटे टाइपो" आर, मैं बस "सरल" होने की कोशिश कर रहा था। कोड (और ऐप कॉन्फ़िगरेशन में) में एंडपॉइंट पता समान होता है, फिर भी यह काम नहीं करता है। एक अंतर है, App.config/मूल बात है। यह यूआरआई का हिस्सा नहीं है, डॉनो क्यों VSTUDIO ने कहा। यदि आप उस यूआरएल (मूल/मूल) पर ब्राउज़ करते हैं तो यह काम नहीं करता है। कहने की जरूरत नहीं है, मैंने दोनों की कोशिश की है।मुझे लगता है कि मुझे अपने "एंडपॉइंट" सृजन में कुछ याद आ रहा है जो App.config है। असल में, मैं अपना अंत बिंदु किसी भी पैरामीटर नहीं दे रहा हूं लेकिन यूरी, अन्य सभी एपीपी.कॉन्फिग जानकारी के बारे में क्या? –

+0

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

+0

हाय मार्क, समस्या यूआरआई नहीं थी, लेकिन मेरे क्लाइंट वेब.कॉन्फिग में कुछ पैरामीटर थे जो प्रोग्रामिंग के दौरान बाध्यकारी में नहीं जा रहे थे। मैंने सबकुछ ठीक से पारित किया जैसा कि यह web.config में था (इमानुअल के सुझाव का उपयोग करके) और यह काम करता था। आपकी सहायताके लिए धन्यवाद! आपके लिए +1 –

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

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