Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł ułatwia rozwiązanie problemu z wyjątkiem AddressAlreadyInUseException, który występuje, gdy usługa .NET 4.0 Windows Communication Foundation (WCF) jest przenoszona do platformy .NET 4.5.
Oryginalna wersja produktu: Windows Communication Foundation
Oryginalny numer KB: 2773443
Symptomy
Rozważmy następujący scenariusz:
Masz usługę WCF platformy .NET 4.0 skonfigurowaną z NetTcpBinding
punktem końcowym i współużytkując pojedynczy port i jawnie konfigurując listenBacklog
wartości domyślne 10.maxConnections
netTcpBinding
Przykład tej konfiguracji wygląda następująco:
<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>
W tym scenariuszu może zostać wyświetlony komunikat AddressAlreadyInUseException
po przeniesieniu aplikacji do platformy .NET 4.5. Wyjątek jest podobny do następującego:
System.ServiceModel.AddressAlreadyInUseException: w punkcie końcowym ADRESU IP 0.0.0.0:xxxx istnieje już odbiornik. Może się tak zdarzyć, jeśli inna aplikacja już nasłuchuje w tym punkcie końcowym lub jeśli masz wiele punktów końcowych usługi na hoście usługi z tym samym punktem końcowym IP, ale z niezgodnymi konfiguracjami powiązań. >--- System.Net.Sockets.SocketException: Tylko jedno użycie każdego adresu gniazda (protokół/adres sieciowy/port) jest zwykle dozwolone w system.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Sockets.Bind(EndPoint localEP) at System.ServiceModel.Channels.SocketConnectionListener.Listen() --- Koniec śledzenia stosu wyjątku wewnętrznego --- w lokalizacji System.ServiceModel.Channels.SocketConnectionListener.Listen() pod adresem System.ServiceModel.Channels.BufferedConnectionListener.Listen() w: System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen() w: System.ServiceModel.Channel.TransportManager.Open(TransportChannelListener channelListener) w: System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.ConnectionOrientedTransportChannelListener.OnOpen(TimeSpan timeSpan timeout) at System.ServiceModel.Channels.TcpChannelListener'2.OnOpen(TimeSpan 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 timeSpan timeout) at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(Limit czasu timeSpan)
Przyczyna
Program WCF nie obsługuje punktu końcowego usługi z NetTcpBinding
punktem końcowym usługi i punktów końcowych mex z mexTcpBinding
tym samym portem, który został jeszcze inaczej skonfigurowany listenBacklog
i maxConnections
. Jeśli usługa 4.0 została skonfigurowana tak, aby miała listenBacklog
wartość i/lub maxConnections
miała wartość 10, działało to, ponieważ te wartości domyślne były takie same zarówno dla netTcp, jak i mexTcpBinding
. Jednak w wersji 4.5, aby uprościć limity przydziału, zostały one zwiększone o wielokrotność liczby procesorów (12 * liczba procesorów), chyba że zostały jawnie skonfigurowane. W związku z tym po przeniesieniu tej usługi 4.0 do platformy 4.5 wartości domyślne zmieniają się niejawnie na nowe wartości punktu końcowego, w którym nie zostały jawnie skonfigurowane, co prowadzi do niezgodności z tymi wartościami dla punktu końcowego, w którym są jawnie skonfigurowane, powodując.AddressAlreadyInUseException
Rozwiązanie
Aby rozwiązać ten problem, zastosuj jedną z aktualizacji opisanych w następujących artykułach bazy wiedzy Knowledge Base (KB):
Uwaga 16.
Aby uzyskać więcej informacji na temat tego problemu, zobacz Problem 2 w sekcji WCF .
Rozwiązanie
Aby obejść ten problem, wybierz jedną z następujących opcji:
Usuń jawną konfigurację i
listenBacklog
maxConnections
uruchom ponownie usługę.Hostowanie punktu końcowego usługi za pomocą
netTcpBinding
punktu końcowego i punktu końcowegomexTcpBinding
mex na różnych portach.
Więcej informacji
Aby uzyskać więcej informacji na temat hostowania punktu końcowego usługi za pomocą netTcpBinding
punktu końcowego usługi i punktu końcowego mexTcpBinding
mex na różnych portach, zobacz Przewodnik Szybki start dotyczący rozwiązywania problemów z usługą WCF.