升级到 .NET 4.5 后获取 AddressAlreadyInUseException

Posted

技术标签:

【中文标题】升级到 .NET 4.5 后获取 AddressAlreadyInUseException【英文标题】:Getting AddressAlreadyInUseException after upgrading to .NET 4.5 【发布时间】:2012-10-06 09:14:54 【问题描述】:

我最近在我的服务器上安装了新的 .NET Framework 4.5(以前安装了 4.0),当我启动公开 WCF 端点的 Windows 服务时,我收到了 System.ServiceModel.AddressAlreadyInUseException

System.ServiceModel.AddressAlreadyInUseException: 已经有一个 IP 端点 0.0.0.0:56543 上的侦听器。如果有 另一个应用程序已经在此端点上侦听,或者如果您有 服务主机中具有相同 IP 的多个服务端点 端点但具有不兼容的绑定配置。 ---> System.Net.Sockets.SocketException:每个套接字仅使用一次 地址(协议/网络地址/端口)通常允许在 System.Net.Sockets.Socket.DoBind(端点 endPointSnapshot, SocketAddress 套接字地址)在 System.Net.Sockets.Socket.Bind(EndPoint localEP) 在 System.ServiceModel.Channels.SocketConnectionListener.Listen() --- 内部异常堆栈跟踪结束 --- 在 System.ServiceModel.Channels.SocketConnectionListener.Listen() 在 System.ServiceModel.Channels.BufferedConnectionListener.Listen() 在 System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen() 在 System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener 频道监听器)在 System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) 在 System.ServiceModel.Channels.TransportChannelListener.OnOpen(时间跨度 超时)在 System.ServiceModel.Channels.ConnectionOrientedTransportChannelListener.OnOpen(时间跨度 超时)在 System.ServiceModel.Channels.TcpChannelListener`2.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(时间跨度 超时)在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.ServiceHostBase.OnOpen(时间跨度 超时)在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 Qosit.Infrastructure.UnisServer.OnStart(String[] args)

我的 WCF 端点的配置如下所示:

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBindingConfiguration" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
          <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="MEX">
          <serviceMetadata/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MEX" name="MyAssembly.MyNamespace.MyService">      
        <endpoint address="net.tcp://localhost:56543/MyService"
          binding="netTcpBinding" bindingConfiguration="NetTcpBindingConfiguration" contract="MyAssembly.MyNamespace.MyServiceInterface" />
        <endpoint address="net.tcp://localhost:56543/MEX" binding="mexTcpBinding"
          contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

我认为它与使用相同端口的 MEX 端点有关,但我不确定升级到 .NET Framework 4.5 后如何正确配置它。

WCF 是否发生了变化,导致这些配置引发异常?

【问题讨论】:

我会用TCPView 之类的东西检查 TCP 使用情况,看看有什么可能已经在使用该端口。另外,请尝试更改为另一个端口,看看您是否仍然遇到同样的问题。最后,this blog postnetTcpBinding 有一些关于 MEX 的好信息 【参考方案1】:

这是因为在 netTcp 端点和 mex 端点使用相同端口时存在一些限制,记录在 here 请参阅“使用 NetTcpBinding 在服务端点和 mex 端点之间共享端口”部分。在 4.0 中,listenBackLogMaxConnections 的默认值为 10。在 4.5 中,这些默认值被修改为 12 * ProcessorCount。当您尝试在 netTcpBinding 和 mex 端点之间共享端口时会发生此异常,前提是您对这两个属性具有不同的值。在 4.0 中,这工作得很好,因为您已将这些设置为默认值 (10),因此这些设置在两个端点上没有区别。但在 4.5 中,对于 netTcp 端点,这些保留为 10,但计算为 12* ProcessorCount。所以例外。

解决这个问题有两种方法:

    从配置中删除这些设置(listenBackLogMaxConnections)。这样,您将自动获得 12 * 处理器计数的默认值,该值大于 4.0 默认值。 按照documentation 中所述,在不同的端口上配置 mex 端点的解决方法

请查看this blog了解更多详情。

【讨论】:

感谢您的回答。选择选项 1 为我做到了。【参考方案2】:

当您在控制台应用程序中托管 WCF 服务时,您需要将 App.config 文件从 WCF 项目复制到控制台应用程序,然后从 WCF 项目中删除 App.config 文件,如果您不这样做,您可以也会出现上述错误。

【讨论】:

以上是关于升级到 .NET 4.5 后获取 AddressAlreadyInUseException的主要内容,如果未能解决你的问题,请参考以下文章

从 .NET 4.5 MVC 4 升级到 .NET 4.5.2 MVC 5.2

如何将.net framework 4.5升级到.net框架4.6?

升级 .NET 版本后,TwoWay 或 OneWayToSource 绑定无法在只读属性上工作

Visual Studio 2022 不支持 .NET Framework 4.5 项目的解决办法

vmware 4.5升级到6.0后不能做快照如何解决

将解决方案从 .net framework 4 升级到更高版本。 4.7.2; 4.8.VS2013