2011-07-21 20 views
14

मैं एक साधारण डब्ल्यूसीएफ सेवा-क्लाइंट सेटअप (वर्तमान में एक कंसोल ऐप में स्वयं होस्टिंग द्वारा कार्यान्वित) में विज्ञापन-प्रसार खोज जोड़ने की कोशिश कर रहा हूं। विंडोज 7 पर वीएस -2010 का उपयोग करके डिबगिंग, और ऑनलाइन ट्यूटोरियल में जो कुछ भी मुझे मिल सकता है, लेकिन फिर भी - खोज क्लाइंट को कुछ भी नहीं मिला। कहने की जरूरत नहीं है कि अगर मैं सही सेवा समापन बिंदु पर क्लाइंट खोलता हूं तो मैं ग्राहक से सेवा तक पहुंच सकता हूं।डब्ल्यूसीएफ डिस्कवरी बस काम नहीं करती

सेवा कोड:

using (var selfHost = new ServiceHost(typeof(Renderer))) 
{ 
    try 
    { 
     selfHost.Open(); 
     ... 
     selfHost.Close(); 

सेवा app.config:

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="TestApp.Renderer"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:9000" /> 
      </baseAddresses> 
     </host> 
     <endpoint address="ws" binding="wsHttpBinding" contract="TestApp.IRenderer"/> 
     <endpoint kind="udpDiscoveryEndpoint"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceDiscovery/> 
      <serviceMetadata httpGetEnabled="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

ग्राहक खोज कोड:

DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint()); 
var criteria = new FindCriteria(typeof(IRenderer)) { Duration = TimeSpan.FromSeconds(5) }; 
var endpoints = discoveryClient.Find(criteria).Endpoints; 

'अंतिमबिंदुओं' संग्रह हमेशा खाली बाहर आता है। मैंने एक कमांड लाइन से, एडमिन कमांड लाइन से, कमांड लाइन से सेवा और क्लाइंट को चलाने की कोशिश की है - सब कुछ नहीं, लेकिन इसका कोई फायदा नहीं हुआ (स्थानीय मशीन पर, बिल्कुल नहीं, मैनेशन के लिए मुझे इसे चलाने की आवश्यकता होगी अपने पूरे सबनेट अंत में)

किसी भी मदद :-)

+0

मैंने सेवा डिस्वरी व्यवहार में एक घोषणा समापन बिंदु भी जोड़ने का प्रयास किया है - जिसने – kbo

+0

में मदद नहीं की है क्या क्लाइंट के लिए कोई app.config जानकारी है? –

+0

क्या आपने एक गुंजाइश जोड़ने की कोशिश की है? –

उत्तर

3

अरे! यह फ़ायरवॉल था ... किसी कारण से सभी यूडीपी संचार अवरुद्ध किए गए - फ़ायरवॉल को अक्षम करने से समस्या हल हो गई। अब मुझे केवल सही फ़ायरवॉल कॉन्फ़िगरेशन को समझने की आवश्यकता है ...

+0

क्या आपने कभी फ़ायरवॉल को कॉन्फ़िगर करने का तरीका बताया है? मुझे भी यही समस्या हो रही है। – odyth

+1

हां डिस्कवरी सेवाओं का पता लगाने के लिए यूडीपी विस्फोटों पर निर्भर करती है –

35

सराहना की जाएगी यहाँ एक सुपर सरल खोज उदाहरण है। यह एक कॉन्फ़िगरेशन फ़ाइल का उपयोग नहीं करता है, यह सभी सी # कोड है, लेकिन आप शायद कॉन्फ़िगरेशन फ़ाइल को अवधारणाओं को पोर्ट कर सकते हैं।

शेयर मेजबान और क्लाइंट प्रोग्राम के बीच इस इंटरफेस (अब के लिए प्रत्येक कार्यक्रम के लिए नकल)

[ServiceContract] 
public interface IWcfPingTest 
{ 
    [OperationContract] 
    string Ping(); 
} 

मेजबान कार्यक्रम

public class WcfPingTest : IWcfPingTest 
{ 
    public const string magicString = "djeut73bch58sb4"; // this is random, just to see if you get the right result 
    public string Ping() {return magicString;} 
} 
public void WcfTestHost_Open() 
{ 
    string hostname = System.Environment.MachineName; 
    var baseAddress = new UriBuilder("http", hostname, 7400, "WcfPing"); 
    var h = new ServiceHost(typeof(WcfPingTest), baseAddress.Uri); 

    // enable processing of discovery messages. use UdpDiscoveryEndpoint to enable listening. use EndpointDiscoveryBehavior for fine control. 
    h.Description.Behaviors.Add(new ServiceDiscoveryBehavior()); 
    h.AddServiceEndpoint(new UdpDiscoveryEndpoint()); 

    // enable wsdl, so you can use the service from WcfStorm, or other tools. 
    var smb = new ServiceMetadataBehavior(); 
    smb.HttpGetEnabled = true; 
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
    h.Description.Behaviors.Add(smb); 

    // create endpoint 
    var binding = new BasicHttpBinding(BasicHttpSecurityMode.None); 
    h.AddServiceEndpoint(typeof(IWcfPingTest) , binding, ""); 
    h.Open(); 
    Console.WriteLine("host open"); 
} 

क्लाइंट प्रोग्राम में इस कोड डाल में इस कोड डाल

private IWcfPingTest channel; 
public Uri WcfTestClient_DiscoverChannel() 
{ 
    var dc = new DiscoveryClient(new UdpDiscoveryEndpoint()); 
    FindCriteria fc = new FindCriteria(typeof(IWcfPingTest)); 
    fc.Duration = TimeSpan.FromSeconds(5); 
    FindResponse fr = dc.Find(fc); 
    foreach(EndpointDiscoveryMetadata edm in fr.Endpoints) 
    { 
    Console.WriteLine("uri found = " + edm.Address.Uri.ToString()); 
    } 
    // here is the really nasty part 
    // i am just returning the first channel, but it may not work. 
    // you have to do some logic to decide which uri to use from the discovered uris 
    // for example, you may discover "127.0.0.1", but that one is obviously useless. 
    // also, catch exceptions when no endpoints are found and try again. 
    return fr.Endpoints[0].Address.Uri; 
} 
public void WcfTestClient_SetupChannel() 
{ 
    var binding = new BasicHttpBinding(BasicHttpSecurityMode.None); 
    var factory = new ChannelFactory<IWcfPingTest>(binding); 
    var uri = WcfTestClient_DiscoverChannel(); 
    Console.WriteLine("creating channel to " + uri.ToString()); 
    EndpointAddress ea = new EndpointAddress(uri); 
    channel = factory.CreateChannel(ea); 
    Console.WriteLine("channel created"); 
    //Console.WriteLine("pinging host"); 
    //string result = channel.Ping(); 
    //Console.WriteLine("ping result = " + result); 
} 
public void WcfTestClient_Ping() 
{ 
    Console.WriteLine("pinging host"); 
    string result = channel.Ping(); 
    Console.WriteLine("ping result = " + result); 
} 
होस्ट पर

, बस WcfTestHost_Open() फ़ंक्शन को कॉल करें, फिर हमेशा के लिए सो जाओ या कुछ और।

क्लाइंट पर, इन कार्यों को चलाएं। मेजबान के लिए खोलने में थोड़ी देर लगती है, इसलिए यहां कई देरी होती है।

System.Threading.Thread.Sleep(8000); 
this.server.WcfTestClient_SetupChannel(); 
System.Threading.Thread.Sleep(2000); 
this.server.WcfTestClient_Ping(); 

मेजबान उत्पादन ग्राहक उत्पादन

तरह
host open 

तरह

uri found = http://wilkesvmdev:7400/WcfPing 
creating channel to http://wilkesvmdev:7400/WcfPing 
channel created 
pinging host 
ping result = djeut73bch58sb4 

इस गंभीर रूप से कम से कम मैं एक खोज उदाहरण के लिए साथ आने कर सकता है देखना चाहिए दिखना चाहिए। यह सामान बहुत जटिल तेजी से हो जाता है।

+4

ग्रेट पोस्ट। मुझे डब्ल्यूसीएफ के लिए सभी कोड न्यूनतम उदाहरण पसंद हैं! – Peladao

1

क्योंकि यह पहला स्टैकओवरफ्लो डॉट कॉम है जो मैंने 'डब्ल्यूसीएफ डिस्कवरी' की खोज की है, तो मैं आईडीसिन जुवाल लोवी उदाहरण का सुझाव दूंगा: Ad-hoc Discovery। यह एक UdpDiscoveryEndpoint और MEX दोनों का उपयोग कर डब्ल्यूसीएफ डिस्कवरी का एक उत्कृष्ट उदाहरण है। यदि आप IDesign या जुवाल लोवी से परिचित नहीं हैं तो मैं यह भी MSDN link सुझाऊंगा।

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