如何使用 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 范围内的随机端口开始(范围任意选择)。我尝试绑定它,如果失败,我会捕获异常。然后我向上一个端口(@987654321@)直到我换行。我没有绑定端口,我放弃测试失败。
【讨论】:
每次尝试端口时如何阻止 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 中实现加密的最简单方法是啥?