9

Find the next TCP port in .Net说明了如何在原始 .net 中执行此操作,但没有说明如何使用 WCF 安全地执行此操作。

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

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

我怎样才能让它告诉我它选择的端口(或完整的端点地址)?

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


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

4

5 回答 5

11

您不需要滚动自己的端口查找逻辑 - 如果您将其指定为 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;
于 2014-07-28T14:55:33.650 回答
4

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

于 2010-01-05T21:08:50.737 回答
2

4 年后.. 目前我们有一个解决方案,设置ListenUriModeUnique,如MSDN所述

这是一个端点配置的小例子

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

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

于 2014-06-24T09:23:36.827 回答
2

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

于 2009-11-26T13:27:38.633 回答
1

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

于 2009-12-01T09:53:26.530 回答