El servicio WCF de .NET 4.0 inicia 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 de .NET 4.0 Windows Communication Foundation (WCF) se mueve a .NET 4.5.
Versión del producto original: Windows Communication Foundation
Número KB original: 2773443
Síntomas
Imagine la siguiente situación:
Tiene un servicio WCF de .NET 4.0 configurado con un punto de conexión que comparte un único puerto y configura explícitamente o en los valores predeterminados de NetTcpBinding listenBacklog maxConnections netTcpBinding 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 una escucha en el extremo IP 0.0.0.0:xxxx. Esto podría ocurrir si hay otra aplicación que ya escucha en este extremo o si tiene varios extremos de servicio en el host de servicio con el mismo extremo IP pero con configuraciones de enlace incompatibles. ---> System.Net.Sockets.SocketException: Solo se permite un uso de cada dirección de socket (protocolo/dirección de red/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() --- End of inner exception stack trace --- 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 el System.ServiceModel.Channels.ConnectionOrientedTransportChannelListener.OnOpen(timeSpan timeout) at System.ServiceModel.Channels.TcpChannelListener'2.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan tiempo de espera) en System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(tiempo de espera de TimeSpan) en System.ServiceModel.Channels.CommunicationObject.Open(tiempo de espera de TimeSpan) en System.ServiceModel.ServiceHostBase.OnOpen(tiempo de espera de TimeSpan) en System.ServiceModel.Channels.CommunicationObject.Open(tiempo de espera de TimeSpan)
Causa
WCF no admite el extremo de servicio con y el extremo mex con estar en el mismo puerto pero con una NetTcpBinding mexTcpBinding configuración diferente y listenBacklog maxConnections . Si configuró el servicio 4.0 para que tenga el listenBacklog y/o sea maxConnections 10, funcionó porque estos valores predeterminados eran los mismos para NetTcp y mexTcpBinding . Sin embargo, en la versión 4.5 para simplificar las cuotas, estas se incrementaron para ser un múltiplo del número de procesadores (recuento de procesadores de 12 *) a menos que se haya configurado explícitamente. Por lo tanto, cuando este servicio 4.0 se mueve a 4.5 framework, 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 un error de coincidencia con estos valores para el extremo donde están configurados explícitamente causando AddressAlreadyInUseException el .
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 acerca de este problema, vea el problema 2 en la sección WCF.
Solución alternativa
Para evitar este problema, elija una de las siguientes opciones:
Quite la configuración explícita para
listenBacklogymaxConnectionsreinicie el servicio.Host the service endpoint with
netTcpBindingand mex endpoint withmexTcpBindingon different ports.
Más información
Para obtener más información sobre cómo hospedar el extremo de servicio con y el punto de conexión mex con en netTcpBinding mexTcpBinding puertos diferentes, vea Inicio rápido de solución deproblemas de WCF .