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

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

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

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

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

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


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

【问题讨论】:

  • 请将马特的帖子标记为答案。它确实有效,所以要让新访问者清楚。

标签: .net wcf unit-testing tcp nettcpbinding


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 2017-09-19
      • 2013-09-03
      • 2010-09-17
      • 2019-07-12
      • 2013-02-12
      • 2018-12-04
      • 1970-01-01
      相关资源
      最近更新 更多