WCF Discovery находит конечную точку, но хост является "localhost" - PullRequest
4 голосов
/ 24 марта 2010

Я пытаюсь использовать функцию обнаружения в WCF, используя http://msdn.microsoft.com/en-us/library/dd456783(v=VS.100).aspx в качестве отправной точки. Он отлично работает на моей машине, но затем я хотел запустить службу на другой машине. Служба была обнаружена правильно, но имя хоста найденной службы всегда "localhost", что, конечно, не очень полезно

Конечная точка обслуживания:

var endpointAddress = new EndpointAddress(new UriBuilder { Scheme = Uri.UriSchemeNetTcp, Port = port}.Uri);
var endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IServiceInterface)), new NetTcpBinding (), endpointAddress);

Клиент:

static EndpointAddress FindServiceAddress<T>()
{
  Stopwatch stopwatch = new Stopwatch();
  stopwatch.Start();
  DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
  // Find  endpoints            
  FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(T)));
  Console.WriteLine(string.Format("Searched for {0} seconds. Found {1} Endpoint(s).",stopwatch.ElapsedMilliseconds / 1000,findResponse.Endpoints.Count));
  if (findResponse.Endpoints.Count > 0)
  {
     return findResponse.Endpoints[0].Address;
  }
  return null;
 }

Должен ли я просто установить для хоста значение System.Environment.MachineName?

Ответы [ 2 ]

8 голосов
/ 20 декабря 2010

Я потратил много времени на изучение этой проблемы. Построение базовых адресов в коде было для меня неприемлемым, поскольку подразумевает жесткую схему транспортной схемы и порта (последний, конечно, может храниться в отдельном разделе конфигурации, но почему бы не использовать существующий раздел?) Я хотел иметь возможность просто настроить базовый адрес в конфигурации, как обычно. И получается, что базовый адрес типа <add baseAddress="net.tcp://*:8731/"/> будет отлично работать. Я думаю, что то же самое верно для программной конфигурации.

8 голосов
/ 25 марта 2010

После еще нескольких поисков я не нашел другого решения, кроме как использовать System.Environment.MachineName

 new EndpointAddress(new UriBuilder {Scheme = Uri.UriSchemeNetTcp, Port = port, Host = System.Environment.MachineName}.Uri);
...