升级到.NET 4.5后获取AddressAlreadyInUseException

时间:2012-10-16 09:47:53

标签: wcf .net-4.0 configuration .net-4.5

我最近在我的服务器上安装了新的.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(EndPoint endPointSnapshot,   SocketAddress(socketAddress)at   System.Net.Sockets.Socket.Bind(EndPoint localEP)at   System.ServiceModel.Channels.SocketConnectionListener.Listen()---   内部异常堆栈跟踪结束--- at   System.ServiceModel.Channels.SocketConnectionListener.Listen()at   System.ServiceModel.Channels.BufferedConnectionListener.Listen()at   System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen()
  在   System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener   channelListener)at   System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback   selectTransportManagerCallback)at   System.ServiceModel.Channels.TransportChannelListener.OnOpen(时间跨度   超时)at   System.ServiceModel.Channels.ConnectionOrientedTransportChannelListener.OnOpen(时间跨度   超时)at   System.ServiceModel.Channels.TcpChannelListener`2.OnOpen(时间跨度   超时)at   System.ServiceModel.Channels.CommunicationObject.Open(时间跨度   超时)at   System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(时间跨度   超时)at   System.ServiceModel.Channels.CommunicationObject.Open(时间跨度   在System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan   超时)at   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是否有变化,以便这些配置引发异常?

2 个答案:

答案 0 :(得分:16)

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

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

  1. 从配置中删除这些设置(listenBackLogMaxConnections)。通过这种方式,您将自动获得默认的12 *处理器计数,即&gt;超过4.0默认值。
  2. 按照documentation
  3. 中所述,在另一个端口上配置mex端点

    请查看this blog了解详情。

答案 1 :(得分:1)

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