.NET 4.0 WCF service throws AddressAlreadyInUseException when moved to .NET 4.5
Dieser Artikel hilft Ihnen beim Beheben der Ausnahme AddressAlreadyInUseException, die auftritt, wenn .NET 4.0 Windows Communication Foundation (WCF)-Dienst zu .NET 4.5 verschoben wird.
Ursprüngliche Produktversion: Windows Communication Foundation
Ursprüngliche KB-Nummer: 2773443
Problembeschreibung
Stellen Sie sich folgendes Szenario vor:
Sie haben einen .NET 4.0 WCF-Dienst mit einem und einem Endpunkt konfiguriert, der einen einzelnen Port gemeinsam verwendet und explizit die NetTcpBinding listenBacklog maxConnections netTcpBinding Standardwerte von 10 konfiguriert oder verwendet. Ein Beispiel für diese Konfiguration ist:
<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>
In diesem Szenario erhalten Sie möglicherweise eine, AddressAlreadyInUseException wenn die Anwendung zu .NET 4.5 verschoben wird. Die Ausnahme ist ähnlich wie folgt:
System.ServiceModel.AddressAlreadyInUseException: Es ist bereits ein Listener auf dem IP-Endpunkt 0.0.0.0:xxxx vorhanden. Dies kann passieren, wenn bereits eine andere Anwendung auf diesem Endpunkt lauscht oder wenn Sie mehrere Dienstendpunkte in Ihrem Diensthost mit demselben IP-Endpunkt, aber mit inkompatiblen Bindungskonfigurationen haben. ---> System.Net.Sockets.SocketException: Unter System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, EndPoint endPointSnapshot) ist normalerweise nur eine Verwendung jeder Socketadresse (Protokoll-/Netzwerkadresse/Port) zulässig. SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at System.ServiceModel.Channels.SocketConnectionListener.Listen() --- End of inner exception stack trace --- at System.ServiceModel.Channels.SocketConnectionListener.Listen() at System.ServiceModel.Channels. BufferedConnectionListener.Listen() at System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen() at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener) at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.ConnectionOrientedTransportChannelListener.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.TcpChannelListener'2.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
Ursache
WCF unterstützt nicht den Dienstendpunkt mit NetTcpBinding und den Mex-Endpunkt, mexTcpBinding der sich auf demselben Port befindet, jedoch unterschiedlich konfiguriert listenBacklog ist und maxConnections . Wenn Sie Ihren 4.0-Dienst so konfiguriert haben, dass er den listenBacklog Wert und/oder maxConnections den Wert 10 aufweist, hat er funktioniert, da diese Standardwerte für NetTcp und . mexTcpBinding In 4.5 wurden diese jedoch zur Vereinfachung der Kontingente auf ein Vielfaches der Prozessoranzahl (12 * Prozessoranzahl) erhöht, sofern sie nicht explizit konfiguriert wurden. Wenn dieser 4.0-Dienst daher in das 4.5-Framework verschoben wird, ändern sich die Standardwerte implizit zu den neuen Werten für den Endpunkt, wo sie nicht explizit konfiguriert wurden, was zu einer Nichtübereinstimmung mit diesen Werten für den Endpunkt führt, wo sie explizit konfiguriert sind, wodurch die AddressAlreadyInUseException .
Lösung
Um dieses Problem zu beheben, wenden Sie eines der Updates an, die in den folgenden Knowledge Base (KB)-Artikeln beschrieben sind:
Hinweis
Weitere Informationen zu diesem Problem finden Sie in Problem 2 im WCF-Abschnitt.
Problemumgehung
Um dieses Problem zu umgehen, wählen Sie eine der folgenden Optionen aus:
Entfernen Sie die explizite Konfiguration für
listenBacklogmaxConnectionsden Dienst, und starten Sie den Dienst neu.Hosten Sie den Dienstendpunkt mit
netTcpBindingund den Mex-EndpunktmexTcpBindingan verschiedenen Ports.
Weitere Informationen
Weitere Informationen zum Hosten des Dienstendpunkts mit netTcpBinding und des mex-Endpunkts mexTcpBinding mit auf verschiedenen Ports finden Sie unter WCF-Problembehandlung – Schnellstart.