2009-03-09 3 views
2

Есть ли способ поиска существования данной службы WCF на любом компьютере локальной сети?Поиск службы WCF в локальной сети?

Например, я ищу службу Math/Add2Numbers, и я хочу знать, какие машины в локальной сети обеспечивают ее, есть ли способ сделать это?

ответ

4

Вот пример простого простого открытия. Он не использует конфигурационный файл, это все код C#, но вы, вероятно, можете портировать концепции в файл конфигурации.

доля этого интерфейса между хостом и программой-клиентом (копировать в каждой программе на данный момент)

[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 

это серьезно минимум я мог бы придумать для примера открытия. Этот материал становится довольно сложным быстро.

2

Что вам нужно, это WS-Discovery, но, к сожалению, это не входит в состав ws- * расширений в WCF. Есть некоторые доморощенные реализации. Вот для этого google search.

В противном случае вы можете реализовать решение UDDI предприятия или реестра сторонним поставщиком (например, IBM или Microsoft).

0

Вы можете использовать UDDI, чтобы найти его, но если было несколько экземпляров службы, как бы вы определили, какой экземпляр использовать?

Смежные вопросы