Wcf 升级到.NET 4.5后获取AddressReadyUseException

Wcf 升级到.NET 4.5后获取AddressReadyUseException,wcf,.net-4.0,configuration,.net-4.5,Wcf,.net 4.0,Configuration,.net 4.5,我最近在我的服务器上安装了新的.NET Framework 4.5(以前安装的是4.0),当我启动公开WCF端点的Windows服务时,我得到了一个System.ServiceModel.addressalReadyUseException System.ServiceModel.AddressalReadyUseException:已存在一个 IP端点0.0.0.0:56543上的侦听器。如果有,这可能发生 另一个应用程序已在侦听此终结点,或者 服务主机中具有相同IP的多个服务终结点 端点,但

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

System.ServiceModel.AddressalReadyUseException:已存在一个 IP端点0.0.0.0:56543上的侦听器。如果有,这可能发生 另一个应用程序已在侦听此终结点,或者 服务主机中具有相同IP的多个服务终结点 端点,但绑定配置不兼容。--> System.Net.Sockets.SocketException:每个套接字仅使用一次 地址(协议/网络地址/端口)通常在 System.Net.Sockets.Socket.DoBind(端点快照, SocketAddress SocketAddress)位于 位于的System.Net.Sockets.Socket.Bind(端点localEP) System.ServiceModel.Channels.SocketConnectionListener.Listen()--- 内部异常堆栈跟踪的结束---at System.ServiceModel.Channels.SocketConnectionListener.Listen()位于 System.ServiceModel.Channel.BufferedConnectionListener.Listen()位于 System.ServiceModel.Channel.ExclusiveETCPTransportManager.OnOpen()
在 System.ServiceModel.Channel.TransportManager.Open(TransportChannelListener 频道侦听器)在 System.ServiceModel.Channel.TransportManagerContainer.Open(选择TransportManagersCallback) 在上选择TransportManagerCallback) System.ServiceModel.Channel.TransportChannelListener.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channel.ConnectionOrientedTransportChannelListener.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channels.tcpcchannellistener`2.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channel.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channel.CommunicationObject.Open(时间跨度 超时)位于System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channel.CommunicationObject.Open(时间跨度 超时)在Qosit.Infrastructure.UnisServer.OnStart(字符串[]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是否发生了更改,因此这些配置会引发异常?

这是因为对netTcp端点和mex端点使用相同端口时存在一些限制。请参阅“使用NetTcpBinding在服务端点和mex端点之间共享端口”一节。在4.0中,
listenBackLog
MaxConnections
的默认值为10。在4.5中,这些违约被修改为12*ProcessorCount。如果这两个属性的值不同,则尝试在netTcpBinding和mex端点之间共享端口时会发生此异常。在4.0中,这很好,因为您已将这些设置为默认值(10),因此这些设置在两个端点上没有差异。但在4.5中,对于netTcp端点,这些值保留为10,但计算为12*ProcessorCount。所以例外

要解决此问题,有两种方法:

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

  • 请查看以了解更多详细信息。

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

    我会用类似的方法检查TCP的使用情况,看看有什么可能已经在使用该端口。另外,尝试切换到另一个端口,看看是否仍然存在相同的问题。最后,通过
    netTcpBinding
    了解一些关于MEX的好信息,谢谢您的回答。选择选项1是为了我。