.net 我如何找到一个使用NetTcpBinding(WCF)免费的TCP端口(以便服务器可以绑定到它)

.net 我如何找到一个使用NetTcpBinding(WCF)免费的TCP端口(以便服务器可以绑定到它),.net,wcf,unit-testing,tcp,nettcpbinding,.net,Wcf,Unit Testing,Tcp,Nettcpbinding,说明如何在原始.net中执行此操作,但不说明如何使用WCF安全地执行此操作 在我的单元测试中,我需要使用NetTcpBinding,我不希望硬编码它正在使用的端口 因此,如何让NetTcpBinding在我的ServiceHost中使用时自动选择空闲端口 如何让它告诉我它选择的端口(或完整端点地址) 或者,我如何使用.NET找到服务器绑定到的几个有效端口 鉴于我的赏金没有带来任何新的答案,我想我们可以假设没有好的答案。我的做法是:从1025-2000范围内的随机端口开始(任意选择的范围)。我尝

说明如何在原始.net中执行此操作,但不说明如何使用WCF安全地执行此操作

在我的单元测试中,我需要使用NetTcpBinding,我不希望硬编码它正在使用的端口

因此,如何让NetTcpBinding在我的ServiceHost中使用时自动选择空闲端口

如何让它告诉我它选择的端口(或完整端点地址)

或者,我如何使用.NET找到服务器绑定到的几个有效端口



鉴于我的赏金没有带来任何新的答案,我想我们可以假设没有好的答案。

我的做法是:从1025-2000范围内的随机端口开始(任意选择的范围)。我尝试绑定它,如果失败,我将捕获异常。然后我向上移动一个端口(
port=port%2000+1025
),直到结束。如果没有绑定端口,我放弃测试失败。

当使用随机高端口时,您可能会与希望在程序启动后启动的其他服务器进程产生冲突。
只需使用零作为端口号,并让操作系统关心保留(/etc/services在unix上,不知道windows如何处理它)。

将端口设置为零。这允许操作系统为您选择一个可用端口。如果您需要确定使用了哪个端口,您可以在本地绑定后从套接字查询该端口。

4年后。。 目前,我们有一个解决方案,将
listenuimode
设置为
Unique
,如中所述

这里是一个端点配置的小示例

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


现在是下一个问题:如果端口是动态的,客户端如何知道它?正如您可以使用中所述:它需要在服务器端和客户端都进行一些配置,但效果很好(唯一的问题是需要几秒钟才能获得它,默认情况下需要20秒,但强制执行5秒并没有问题)

您不需要使用自己的端口查找逻辑-如果您将空闲端口指定为0,Windows将选择该端口。然后,您可以通过询问调度员来确定分配了哪个端口,如下所示:

// 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;

你如何阻止windows防火墙打开?每次你尝试一个端口时,它都是英国的?嗯,我不知道这个防火墙的事情;我的devel计算机上没有防火墙,因为它位于防火墙网络中。我没有在我开发网络应用程序的计算机上或在我的生成计算机上配置防火墙,因此这不是问题。抱歉,我只关心Windows如何从NetCpBinding WCF获取套接字,如果我传入一个端口0?请标记Matt的帖子作为答案。它确实有效,所以请向新访客说明。