Поиск службы WCF в локальной сети? - PullRequest
2 голосов
/ 09 марта 2009

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

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

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

Вот очень простой пример открытия. Он не использует файл конфигурации, это весь код на 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 голосов
/ 09 марта 2009

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

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

0 голосов
/ 10 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...