如何使用 NetTcpBinding (WCF) 找到可用的 TCP 端口(以便服务器可以绑定到它)

Posted

技术标签:

【中文标题】如何使用 NetTcpBinding (WCF) 找到可用的 TCP 端口(以便服务器可以绑定到它)【英文标题】:How can I find a TCP port that is free with NetTcpBinding (WCF) (so a server can bind to it) 【发布时间】:2010-12-20 15:47:19 【问题描述】:

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

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

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

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

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


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

【问题讨论】:

请将马特的帖子标记为答案。它确实有效,所以要让新访问者清楚。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

如果我传入 0 端口,如何从 NetTcpBinding WCF 获取套接字?【参考方案3】:

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

【讨论】:

每次尝试端口时如何阻止 Windows 防火墙打开它的英国? 呃,我不知道这个防火墙的事;我的开发机器上没有防火墙,因为它位于防火墙网络内 Ian,我在开发网络应用程序的机器上或构建机器上没有配置防火墙,所以这不是问题。【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

抱歉我只关心windows

以上是关于如何使用 NetTcpBinding (WCF) 找到可用的 TCP 端口(以便服务器可以绑定到它)的主要内容,如果未能解决你的问题,请参考以下文章

WCF NetTcpBinding 安全性 - 它是如何工作的?

WCF - 在 nettcpbinding (c#) 中禁用安全性

带有 netTcpBinding 的 WCF 路由服务

使用 netTcpBinding 时,在 WCF 中实现加密的最简单方法是啥?

使用 netTcpBinding 为 WCF 服务启用基于证书的身份验证

使用 netTcpBinding 的慢(ish)WCF 连接速度