Как я могу получить порт, который прослушивает служба WCF? - PullRequest
7 голосов
/ 25 августа 2010

У меня есть служба net.tcp WCF, и я хотел бы, чтобы ОС выбрала порт, который она должна прослушивать. Таким образом, я установил порт на 0 в моем URI, и netstat подтверждает, что ОС выбрала порт в диапазоне 5000.

Как я могу найти действительный порт, выбранный в коде, внутри процесса обслуживания?

Код, показывающий, что я пробовал:

Type serviceType = ...;
Uri address = new Uri("net.tcp://0.0.0.0:0/Service/");
ServiceHost serviceHost = new ServiceHost(serviceType, address);
ServiceEndpoint endPoint = serviceHost.AddServiceEndpoint(type, binding, "");
int port1 = endPoint.ListenUri.Port; // returns 0
int port2 = serviceHost.BaseAddresses.First().Port; // also returns 0

Ответы [ 3 ]

10 голосов
/ 25 августа 2010

Не уверен, поможет ли это, но на SO уже есть похожий вопрос: Как получить адрес / порт прослушивания службы WCF?

Соответствующая частьотправленный ответ, который вы, возможно, захотите попробовать:

foreach (var channelDispatcher in serviceHost.ChannelDispatchers)
{
            Console.WriteLine(channelDispatcher.Listener.Uri);
}

Так что, возможно, вам нужно channelDispatcher.Listener.Uri.Port.

Надеюсь, это поможет!

3 голосов
/ 26 августа 2010

После запуска службы вы можете получить полное описание конечных точек, которые были фактически созданы из коллекции Description.Endpoints (это не будет работать до тех пор, пока не будет вызвана функция Open ()).Из этой коллекции вы можете получить адрес.К сожалению, вам придется анализировать адрес порта для строки.

Это то, что мой сервер регистрирует после каждой службы Open ().

        serviceHost.Open();

        // Iterate through the endpoints contained in the ServiceDescription 
        System.Text.StringBuilder sb = new System.Text.StringBuilder(string.Format("Active Service Endpoints:{0}", Environment.NewLine), 128);
        foreach (ServiceEndpoint se in serviceHost.Description.Endpoints)
        {
            sb.Append(String.Format("Endpoint:{0}", Environment.NewLine));
            sb.Append(String.Format("\tAddress: {0}{1}", se.Address, Environment.NewLine));
            sb.Append(String.Format("\tBinding: {0}{1}", se.Binding, Environment.NewLine));
            sb.Append(String.Format("\tContract: {0}{1}", se.Contract.Name, Environment.NewLine));
            foreach (IEndpointBehavior behavior in se.Behaviors)
            {
                sb.Append(String.Format("Behavior: {0}{1}", behavior, Environment.NewLine));
            }
        }

        Console.WriteLine(sb.ToString());
1 голос
/ 25 августа 2010

В качестве альтернативы вы можете найти свободный порт для WCF для использования самим:

private int FindPort()
{
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);

    using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
    {
         socket.Bind(endPoint);
         IPEndPoint local = (IPEndPoint)socket.LocalEndPoint;
         return local.Port;
    }
}

Код от здесь .

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