[英]Can a WCF NetTcpBinding duplex channel endpoint be on port 80?
[英]How can I find a TCP port that is free with NetTcpBinding (WCF) (so a server can bind to it)
在.Net中找到下一个TCP端口,说明如何在原始.net中执行此操作,但不知道如何使用WCF安全地执行此操作。
在我的单元测试中,我需要使用NetTcpBinding, 我不希望硬编码它正在使用的端口 。
因此,如何在我的ServiceHost中使用NetTcpBinding时自动选择一个空闲端口?
我怎样才能告诉我它选择的端口(或完整端点地址)?
或者我如何使用.NET找到一些对服务器有效的端口?
鉴于我的赏金没有带来任何新答案,我认为我们可以假设没有好的答案。
您不需要滚动自己的端口查找逻辑 - 如果您将其指定为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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.