Udostępnij za pośrednictwem


Usługa .NET 4.0 WCF zgłasza wyjątek AddressAlreadyInUseException po przeniesieniu do platformy .NET 4.5

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:

  1. Usuń jawną konfigurację i listenBacklog maxConnections uruchom ponownie usługę.

  2. Hostowanie punktu końcowego usługi za pomocą netTcpBinding punktu końcowego i punktu końcowego mexTcpBinding 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.