Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
Quite la configuración explícita de
listenBacklog
ymaxConnections
reinicie el servicio.Hospede el punto de conexión de servicio con
netTcpBinding
y el punto de conexión mex conmexTcpBinding
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.