Compartir a través de


El servicio WCF de .NET 4.0 produce AddressAlreadyInUseException cuando se mueve a .NET 4.5

Este artículo le ayuda a resolver la excepción AddressAlreadyInUseException que se produce cuando el servicio .NET 4.0 Windows Communication Foundation (WCF) se mueve a .NET 4.5.

Versión original del producto: Windows Communication Foundation
Número de KB original: 2773443

Síntomas

Imagine la siguiente situación:

Tiene un servicio WCF de .NET 4.0 configurado con y NetTcpBinding un punto de conexión que comparte un único puerto y configura listenBacklog explícitamente o maxConnections en netTcpBinding para los valores predeterminados de 10. Un ejemplo de esta configuración es el siguiente:

<system.serviceModel>
   <services>
      <service name="MyAssembly.MyNamespace.MyService" behaviorConfiguration="MEX">
         <endpoint address="net.tcp://localhost:56543/MyService"
            binding="netTcpBinding" contract="MyAssembly.MyNamespace.MyServiceInterface"
            bindingConfiguration="NetTcpBindingConfiguration" />
         <endpoint address="net.tcp://localhost:56543/MEX" 
            binding="mexTcpBinding" contract="IMetadataExchange" />
      </service>
   </services>
   <bindings>
      <netTcpBinding>
         <binding name="NetTcpBindingConfiguration" listenBacklog="10" maxConnections="10" >
         </binding>
      </netTcpBinding>
   </bindings>
   <behaviors>
      <serviceBehaviors>
         <behavior name="MEX">
            <serviceMetadata/>
         </behavior>
      </serviceBehaviors>
   </behaviors>
</system.serviceModel>

En este escenario, puede recibir una AddressAlreadyInUseException cuando la aplicación se mueve a .NET 4.5. La excepción es similar a la siguiente:

System.ServiceModel.AddressAlreadyInUseException: ya hay un agente de escucha en el punto de conexión IP 0.0.0.0:xxxx. Esto podría ocurrir si hay otra aplicación que ya escucha en este punto de conexión o si tiene varios puntos de conexión de servicio en el host de servicio con el mismo punto de conexión IP pero con configuraciones de enlace incompatibles. >--- System.Net.Sockets.SocketException: en System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot) normalmente solo se permite un uso de cada dirección de socket (protocolo, dirección de red o puerto) en System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) en System.Net.Sockets.Socket.Bind(EndPoint localEP) en System.ServiceModel.Channels.SocketConnectionListener.Listen() --- Fin del seguimiento de pila de excepciones internas --- en System.ServiceModel.Channels.SocketConnectionListener.Listen() en System.ServiceModel.Channels.BufferedConnectionListener.Listen() en System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen() en System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener) en System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) en System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout) en System.ServiceModel.Channels.ConnectionOrientedTransportChannelListener.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.TcpChannelListener'2.OnOpen(TimeSpan timeout) en System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) en System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) en System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) en System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)

Causa

WCF no admite el punto de conexión de servicio con NetTcpBinding y el punto de conexión mex con mexTcpBinding estar en el mismo puerto, pero con una configuración listenBacklog diferente y maxConnections. Si configuró el servicio 4.0 para que tuviera el listenBacklog valor y/o maxConnections para ser 10, funcionaba porque estos valores predeterminados eran los mismos para NetTcp y mexTcpBinding. Sin embargo, en 4.5 para simplificar las cuotas, se aumentaron para que fueran un múltiplo del recuento de procesadores (12 * recuento de procesadores) a menos que se configuraran explícitamente. Por lo tanto, cuando este servicio 4.0 se mueve a la plataforma 4.5, los valores predeterminados cambian implícitamente a los nuevos valores para el punto de conexión donde no se configuraron explícitamente, lo que provoca una falta de coincidencia con estos valores para el punto de conexión donde se configuran explícitamente, lo que provoca AddressAlreadyInUseException.

Solución

Para resolver este problema, aplique una de las actualizaciones que se describen en los siguientes artículos de Knowledge Base (KB):

Nota:

Para obtener más información sobre este problema, vea El problema 2 en la sección WCF .

Solución alternativa

Para solucionar este problema, elija una de las siguientes opciones:

  1. Quite la configuración explícita de listenBacklog y maxConnections reinicie el servicio.

  2. Hospede el punto de conexión de servicio con netTcpBinding y el punto de conexión mex con mexTcpBinding en distintos puertos.

Más información

Para obtener más información sobre cómo hospedar el punto de conexión de servicio con netTcpBinding y el punto de conexión mex con mexTcpBinding en distintos puertos, vea Inicio rápido de solución de problemas de WCF.