在.Net中查找下一个TCP端口说明如何在原始.net中执行此操作,但不是如何使用WCF安全地执行此操作。

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

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

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

或者我如何使用.NET找到一些对服务器有效的端口?


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

有帮助吗?

解决方案 6

目前我认为这是不可能的,感谢所有提供工作的人。

其他提示

您不需要滚动自己的端口查找逻辑 - 如果您将其指定为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;

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

这就是我的工作:从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)

使用随机高端口时,您可以与想要在程序之后启动的其他服务器进程产生冲突。 只需使用零作为端口号,让os关心预订(unix上的/ etc / services,不要知道windows如何处理它)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top