Как я могу найти порт TCP, который свободен с NetTcpBinding (WCF) (чтобы сервер мог привязаться к нему)

StackOverflow https://stackoverflow.com/questions/1803065

Вопрос

Найти следующий порт TCP в .Net говорит, как делать это в raw .net, но не так, как это безопасно делать с WCF.

В моих модульных тестах мне нужно использовать NetTcpBinding, я не хочу жестко кодировать порт, который он использует .

Поэтому, как я могу заставить NetTcpBinding автоматически выбирать свободный порт при использовании в моем ServiceHost?

Как мне узнать, какой порт (или полный адрес конечной точки) он выбрал?

Или как с помощью .NET найти несколько портов, которые могут быть привязаны к серверу?

<Ч>

Учитывая, что моя награда не привела к каким-либо новым ответам, я думаю, мы можем предположить, что нет хорошего ответа.

Это было полезно?

Решение 6

В настоящее время я считаю, что это невозможно, спасибо всем, кто предоставил работу раундами.

Другие советы

Вам не нужно накатывать свою собственную логику поиска портов - Windows выберет свободный порт, если вы укажете его как 0. Затем вы можете узнать, какой порт был назначен, опросив диспетчеров, например так:

// Specify port 0, this will cause Windows to choose a free port
var baseUri = new Uri("net.tcp://" + Dns.GetHostEntry("").HostName + ":0");
host = new WebServiceHost(typeof(MyService));
var endPoint = host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(), baseUri);

 // Tell WCF to actually bind to a free port instead of 0
 endPoint.ListenUriMode = ListenUriMode.Unique;

 host.Open();

 // Now that the host has bound to a specific port, we can find out which one it chose
 return host.ChannelDispatchers.First().Listener.Uri;

Установите порт на ноль. Это позволяет ОС выбирать для вас доступный порт. Если вам нужно определить, какой порт был использован, вы можете запросить его из сокета после того, как он был привязан локально.

Вот что я делаю: начните со случайного порта в диапазоне 1025-2000 (диапазон выбран произвольно). Я пытаюсь связать это, и если это терпит неудачу, я ловлю исключение. Затем я поднимаюсь на один порт ( port = port% 2000 + 1025 ), пока не заверну. Я не привязан ни к одному порту, я сдаю провал теста.

4 года спустя .. в настоящее время у нас есть решение, устанавливающее для ListenUriMode значение Unique , как указано в MSDN

Вот небольшой пример конфигурации конечной точки

<endpoint address="service"
          binding="netTcpBinding"
          contract="Iservice"
          name="TcpBinding"
          bindingConfiguration="netTcpBindingNoSec"
          listenUriMode="Unique"
          />

А теперь следующая проблема: если порт динамический, как клиенты могут это знать? Как указано в ЭТОГО ОТВЕТА , вы можете использовать WCF DISCOVERY : требуется небольшая настройка как на сервере, так и на стороне клиента, но он работает хорошо (единственная проблема в том, что для его получения требуется несколько секунд, по умолчанию 20 секунд, но у меня нет проблем с его установкой на 5)

при использовании случайного порта высокого уровня вы можете создавать конфликты с другими процессами сервера, которые хотят запускаться после вашей программы. просто используйте ноль в качестве номера порта и позвольте операционной системе заботиться о резервировании (/ etc / services в unix, не знаю, как Windows это обрабатывает).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top