2011-05-23 17 views
10

मेरे पास एक डिस्कवरी सक्षम डब्ल्यूसीएफ सेवा है और अब मैं क्लाइंट को उससे कनेक्ट करना चाहता हूं।डब्ल्यूसीएफ डिस्कवरी .NET 4: कॉन्फ़िगरेशन/प्रोग्रामेटिकली परिभाषा के साथ समस्या

समस्या: जब मैं udp endpoint (1.) का उपयोग करता हूं और प्रोग्राम को प्रोग्राम की खोज करने का प्रयास करता हूं, तो यह काम करता है ... जब मैं App.config दृष्टिकोण (2.) का उपयोग करता हूं तो यह नहीं होता है (त्रुटि: कोई अंत बिंदु नहीं खोजा गया)।

मेरे लिए यह समाधान के दोनों के "यूडीपी खोज परिणाम" लगता है एक ही होना चाहिए, लेकिन दुर्भाग्य से यह नहीं है ...

1. प्रोग्राम दृष्टिकोण (काम):

कोड:

 DiscoveryClient discClient = new DiscoveryClient("udpDiscoveryEndpoint"); 
     FindCriteria fCriteria = new FindCriteria(typeof(IAlarmServer)); 
     fCriteria.Duration = TimeSpan.FromSeconds(5); 
     fCriteria.MaxResults = 1; 
     FindResponse fResponse = discClient.Find(fCriteria); 

     EndpointAddress address = fResponse.Endpoints[0].Address; 
     Console.WriteLine("Address found: " + address.ToString()); 

कॉन्फ़िग:

<system.serviceModel> 
    <client> 
    <endpoint name="udpDiscoveryEndpoint" kind="udpDiscoveryEndpoint" /> 
    </client> 
</system.serviceModel> 

2. App.config साथ दृष्टिकोण और "अंतिम बिंदु में एकीकृत" दृष्टिकोण (काम नहीं करता है!):

कोड:

 var Proxy = new AlarmServerClient("IAlarmServer"); // Default client generated by Visual Studio 
     Proxy.SomeMethod(); // throw no endpoints discovered exception 

कॉन्फ़िग:

<standardEndpoints> 
    <dynamicEndpoint> 
    <standardEndpoint name="discoveryDynamicEndpointConfiguration"> 
     <discoveryClientSettings> 
     <findCriteria duration="00:00:05" maxResults="1"> 
      <types> 
      <add name="AlarmServiceRef.IAlarmServer"/> 
      </types> 
     </findCriteria> 
     <endpoint kind="udpDiscoveryEndpoint"/> 
     </discoveryClientSettings> 
    </standardEndpoint> 
    </dynamicEndpoint> 
</standardEndpoints> 

कॉन्फ़िग:

<client> 
    <endpoint binding="basicHttpBinding" bindingConfiguration="DefaultBasicHttpBinding" contract="AlarmServiceRef.IAlarmServer" name="IAlarmServer" 
      kind="dynamicEndpoint" 
      endpointConfiguration="discoveryDynamicEndpointConfiguration"/> 
    </client> 

कोई विचार यह क्यों हो रहा है?

+0

कोई नहीं? = (((((0 ( – David

+0

क्या इस प्रकार का नाम मजबूत है? x0n

उत्तर

0

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

+0

नहीं, क्योंकि यह एक निश्चित आईपी/पता – David

+0

के साथ संदर्भ उत्पन्न करेगा हां, लेकिन आप इसे तुरंत ओवरराइड कर सकते हैं आपकी प्रॉक्सी। –

+0

निश्चित रूप से, लेकिन मेरे पास अभी भी मेरी उड डिस्कवरी के लिए कोई वैध कॉन्फ़िगर नहीं है जो मेरा प्रश्न पहले स्थान पर था;) – David

2

बातें जब आप आईआईएस

  1. के माध्यम से खोज के साथ एक सेवा होस्ट कर रहे हैं सेवा विन्यास में की युगल यकीन है कि सेवा का नाम नाम स्थान
  2. आप सुनिश्चित करने के लिए है सहित वर्ग के नाम से मेल खाता है इससे पहले कि आप ग्राहक के साथ खोज सकें, सेवा चल रही है। आप मैन्युअल रूप से सेवा के .svc फ़ाइल को ब्राउज़ करें या AppFabric साथ सेवा की मेजबानी और सच को ऑटोस्टार्ट सेट कर सकते हैं (आप भी कि web.config में निर्दिष्ट कर सकते हैं)
  3. सेवा विन्यास में आप प्रकार आप 'का उत्सर्जन करने के लिए है क्लाइंट

पर खोज मानदंडों में उपयोग करने के लिए पर जा रहा है, सेवा अंतराल को सेट करने वाले सर्वर कॉन्फ़िगरेशन का नमूना यहां दिया गया है। ध्यान दें कि सेवा "नाम" विशेषता सेवा को कार्यान्वित करने वाले वर्ग के लिए पूर्ण नामस्थान है।

सेवा कॉन्फ़िग

<services> 
     <service name="WcfDiscovery.Services.BuzzerService" behaviorConfiguration="sb1" > 
     <endpoint binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" address="" behaviorConfiguration="eb1" /> 
     <endpoint kind="udpDiscoveryEndpoint" /> 
     </service> 
    </services> 
इसके अलावा

सेवा

सेवा कॉन्फ़िग

<serviceBehaviors> 
     <behavior name="sb1"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <serviceDiscovery /> 
     </behavior> 
     </serviceBehaviors> 

जब से मैं ग्राहकों द्वारा सेवा को खोजने के लिए सक्षम होना चाहते हैं के लिए खोज व्यवहार जोड़ना सुनिश्चित करें टाइप करें (WcfDiscovery.Contracts.IAlarmServer) मुझे यह भी निर्दिष्ट करना होगा कि एंडपॉइंट (eb1)

के लिए व्यवहार कॉन्फ़िगरेशन में

सेवा कॉन्फ़िग

<endpointBehaviors> 
     <behavior name="eb1"> 
      <endpointDiscovery enabled="true"> 
      <types> 
       <add name="WcfDiscovery.Contracts.IAlarmServer" /> 
      </types> 
      </endpointDiscovery> 
     </behavior> 
     </endpointBehaviors> 

अब ग्राहक के पक्ष मैं findCriteria का उपयोग कर सेवा की खोज कर सकते हैं। ध्यान दें कि खोज मापदंड में प्रकार (सेवाओं प्रकार सूची में) सेवा द्वारा उत्सर्जित एक

ग्राहक कॉन्फ़िग

<standardEndpoints> 
     <dynamicEndpoint> 
     <standardEndpoint name="dynamicEndpointConfiguration"> 
      <discoveryClientSettings > 
      <endpoint kind="udpDiscoveryEndpoint" /> 

      <findCriteria maxResults="2"> 
       <types> 
       <add name="WcfDiscovery.Contracts.IAlarmServer" /> 
       </types> 
      </findCriteria> 

      </discoveryClientSettings> 
     </standardEndpoint> 
     </dynamicEndpoint> 
    </standardEndpoints> 

यहाँ ग्राहक endpoint विन्यास

ग्राहक कॉन्फ़िग

है से मेल खाना चाहिए

:
<client> 
     <endpoint kind="dynamicEndpoint" name="endpoint" binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" endpointConfiguration="dynamicEndpointConfiguration" /> 
    </client> 

अंत में, मैं इस तरह एक कंसोल अनुप्रयोग में सेवा की खोज कर सकते

ChannelFactory<IAlarmServer> factory = new ChannelFactory<IAlarmServer>("endpoint"); 
      var proxy = factory.CreateChannel(); 

      Console.WriteLine(proxy.SoundAlarm()); 

आशा है कि इससे मदद मिलती है!

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