2009-03-09 19 views
2

Yerel Ağın herhangi bir bilgisayarında belirli bir WCF hizmetinin varlığını araştırmanın bir yolu var mı?LAN'da WCF servisini mi arıyorsunuz?

Örneğin, Math/Add2Numbers hizmetini arıyorum ve LAN'daki hangi makinelerin sağladığını bilmek istiyorum, bunu yapmanın herhangi bir yolu var mı?

cevap

4

İşte süper basit bir keşif örneğidir. Bir config dosyası kullanmaz, hepsi C# kodudur, ancak muhtemelen kavramları bir config dosyasına aktarabilirsiniz.

pay konak ve istemci programı arasında bu arayüz

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

istemci programında bu kodu koymak konak programına

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"); 
} 

Bu kodu (şimdilik her program için kopyalama)

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); 
} 

anasistemde, sadece WcfTestHost_Open() işlevini çağırın, sonra sonsuza kadar uyuyun. ya da başka birşey. İstemcideki

, bu işlevleri çalıştırın. Bir ev sahibinin açılması biraz zaman alır, bu yüzden burada birkaç gecikme var. İstemci çıkışı

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

bu ciddi bir keşif örneğin ile gelebilir minimum gibi görünmelidir

host open 

gibi

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

konak çıkışı görünmelidir. Bu şey oldukça hızlı bir şekilde karmaşıklaşıyor.

2

İhtiyacınız olan şey WS-Discovery'dir, ancak ne yazık ki, bu WCF'deki ws- * uzantılarının bir parçası olarak dahil değildir. Onun bazı ev yapımı uygulamaları var. İşte bunun için bir google search. Aksi takdirde, bir kuruluş UDDI'sini veya kayıt defteri çözümünü üçüncü taraf bir satıcı tarafından (örneğin, IBM veya Microsoft) uygulayabilirsiniz.

0

UDDI'yi bulmak için kullanabilirsiniz, ancak hizmetin birden çok örneği varsa, hangi örneğin kullanılacağına nasıl karar verirdiniz?

İlgili konular