繁体   English   中英

如何找到NetTcpBinding(WCF)免费的TCP端口(因此服务器可以绑定到它)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM