Получить номер порта от ServiceHost

1

Я создаю WCF ServiceHost с портом 0, чтобы получить динамически назначенный порт:

ServiceHost host = new ServiceHost(typeof(MyClass), new Uri("net.tcp://localhost:0/abc"));
host.AddServiceEndpoint(typeof(MyInterface), new NetTcpBinding(SecurityMode.None), "net.tcp://localhost:0/abc");

Как мне присвоить номер порта?

Я пытался:

host.ChannelDispatchers[0].Listener.Uri.Port

но он просто возвращает 0, что, по-видимому, неверно.

  • 1
    Дублирование? stackoverflow.com/questions/3467651/...
  • 0
    Он предлагает использовать OperationContext.Channel.LocalAddress.Uri.Port
Теги:
wcf
tcp
port

1 ответ

4
Лучший ответ

Хорошо, я думаю, что понял. Вы должны убедиться, что поведение URI прослушивания установлено на уникальное, а также открыть его. По умолчанию он установлен в явном виде.

Я сделал фиктивный класс обслуживания, который содержал следующий контракт на обслуживание:

[ServiceContract]
public class MyClass
{
   [OperationContract]
   public string Test()
   {
      return "test";
   }
}

И добавил соответствующий тестовый класс:

[TestClass]
public class TestMyClass
{
    [TestMethod]
    public string TestPortIsNotZero(){
        var host = new ServiceHost(typeof(MyClass), 
            new Uri("net.tcp://localhost:0/abc"));
        var endpoint = host.AddServiceEndpoint(typeof(MyClass), 
            new NetTcpBinding(SecurityMode.None), "net.tcp://localhost:0/abc");
        //had to set the listen uri behavior to unique
        endpoint.ListenUriMode = ListenUriMode.Unique;
        //in addition open the host
        host.Open();

        foreach (var cd in host.ChannelDispatchers)
        {
           //prints out the port number in the dynamic range
           Debug.WriteLine(cd.Listener.Uri.Port);
           Assert.IsTrue(cd.Listener.Uri.Port >= 0); 
        }
   }
}
  • 0
    Это работает. Но в соответствии с MSDN, если совместное использование портов включено - это добавит guid к URI. Должен быть способ получить порт без этого, поскольку он, кажется, не связан.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню