На конечной точке IP уже есть прослушиватель 0.0.0.0:13000.??(TCP с использованием WCF) - PullRequest
16 голосов
/ 17 марта 2012

Я пытаюсь выяснить, почему порт используется даже после перезагрузки компьютера!

System.ServiceModel.AddressAlreadyInUseException: на конечной точке IP уже есть прослушиватель 0.0.0.0:13000,Это может произойти, если другое приложение уже прослушивает эту конечную точку или если на хосте службы имеется несколько конечных точек службы с одинаковой конечной точкой IP, но с несовместимыми конфигурациями привязки.---> System.Net.Sockets.SocketException: только одно использование каждого адреса сокета (протокол / сетевой адрес / порт) обычно разрешено в System.Net.Sockets.Socket.DoBind (EndPoint endPointSnapshot, SocketAddress socketAddress) в System.Net.Sockets.Socket.Bind (EndPoint localEP) в System.ServiceModel.Channels.SocketConnectionListener.Listen () --- Конец внутренней трассировки стека исключений --- в System.ServiceModel.Channels.SocketConnectionListener.Listen () в System.ServiceModel.Channels.TracingConnectionListener.ServiceModel.Channels.TransportManagerContainer.Open (SelectTransportManagersCallback selectTransportManagerCallback) в System.ServiceModel.Channels.TcpChannelListener`2.OnOpen (время ожидания TimeSpan) в System.ServiceModel.Channels.CmunionObject.Open (Тайм-аут TimeSpan) в System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (Тайм-аут TimeSpan) в System.ServiceModel.Channels.CommunicationObject.Open (Тайм-аут TimeSpan) в System.ServiceModel.ServiceHoutpenOst.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) в Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService (информация ServiceInfo) System.Net.Sockets.SocketException (0x80004005): только одно использование каждого адреса сокета (протокол / сетевой адрес / порт /) обычно разрешается в System.Net.Sockets.Socket.DoBind (EndPoint endPointSnapshot, SocketAddress socketAddress) в System.Net.Sockets.Socket.Bind (EndPoint localEP) в System.ServiceModel.Channels.SocketConnectionListener.Listen ()

Как определить, какой процесс прослушивает этот порт (13000)?Netstat ничего не показывает на этом порту.

Вот мой App.config:

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="SomeTarget.SomeTargetService">
        <endpoint address="" binding="customBinding" bindingConfiguration="NetTcpBinding"
          contract="SomeTarget.ISomeTargetService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:13000" />
          </baseAddresses>
        </host>
      </service>
    </services>

    <bindings>
      <customBinding>
        <binding name="NetTcpBinding" sendTimeout="00:05:00" closeTimeout="00:00:30" openTimeout="00:00:30" receiveTimeout="00:05:00">
          <transactionFlow />
          <binaryMessageEncoding />
          <windowsStreamSecurity protectionLevel="None" />
          <tcpTransport maxBufferPoolSize="524288"
                        maxReceivedMessageSize="1024"
                        maxBufferSize="1024" >
            <connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
                                    idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" />
          </tcpTransport>
        </binding>
      </customBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

Ответы [ 6 ]

27 голосов
/ 13 сентября 2012

Я столкнулся с этой проблемой после установки .Net 4.5 и выкладываю здесь решение, чтобы помочь другим, если они столкнутся с ним. Ответ @ berkayk, приведенный выше, сработал (выставив mex на другой порт), но мне нужно было выставить обе конечные точки через один порт.

Предположим, у вас есть две конечные точки, одна из которых использует netTcpBinding, а другая - mexTcpBinding. При использовании привязок по умолчанию некоторые значения по умолчанию рассчитываются с использованием OSEnvironmentHelper.ProcessorCount вместо жестко заданных значений, как это было в .Net 4.0.

В моем случае, при использовании именованного netTcpBinding bindingConfiguration значение, предоставленное для свойства MaxConnections, было равно 20. Установка свойства MaxConnections в NetTcpBinding также устанавливает его свойство TcpTransportBindingElement MaxPendingConnections и свойство ConnectionPoolSettings.MaxPettingSecount.

Если не использовать именованную netTcpBinding bindingConfiguration и использовать только значение по умолчанию, свойство MaxPendingConnections рассчитывалось с использованием следующего алгоритма:

 return (12 * OSEnvironmentHelper.ProcessorCount);

Транспорт mexTcpBinding также вычислил его свойство MaxPendingConnections с использованием вышеуказанного алгоритма, поэтому, когда ни один из них не использует именованную bindingConfiguration, значения по умолчанию совпадают, и проблемы не возникает.

При использовании именованного netTcpBinding bindingConfiguration, MaxPendingConnections транспорта было 20, а MaxPendingConnections транспорта mexTcpBinding на моем компьютере равнялся 96. Разница в значениях для MaxPendingConnections между этими двумя конечными точками, совместно использующими один и тот же порт, несовместима.

Я также обнаружил, что эта проблема возникла и с набором ListenBacklog. (Я не знаю всех возможных конфликтующих значений, которые могут существовать.)

Чтобы решить эту проблему, вы можете создать настраиваемую привязку для mex, которая соответствует названной bindingConfiguration для netTcpBinding. Пример ниже:

<endpoint binding="netTcpBinding" bindingConfiguration="TestNetTcpBinding"
      contract="YourContract" />
<endpoint address="mex" binding="customBinding" bindingConfiguration="TestMexBinding"
      contract="IMetadataExchange" />

<bindings>
<customBinding>
<binding name="TestMexBinding">
<tcpTransport maxPendingConnections="20" listenBacklog="20">                   
<connectionPoolSettings groupName="default"  maxOutboundConnectionsPerEndpoint="20" />
</tcpTransport>
</binding>
</customBinding>
<netTcpBinding>
<binding name="TestNetTcpBinding" listenBacklog="20" maxConnections="20"/>
</netTcpBinding>
</bindings>

Или вы не можете указать какие-либо рассчитанные значения (например, maxConnections и listenBacklog) и принять значения по умолчанию (обратите внимание, что MaxOutboundConnectionsPerEndpoint по-прежнему сохранит значение по умолчанию, равное 10, поскольку оно не рассчитывается так же, как свойство MaxPendingConnections. ):

<binding name="TestNetTcpBinding" ...someOtherProperties except listenBacklog and maxConnections/>

Примечание: проблема описана здесь: http://msdn.microsoft.com/en-us/library/aa702636.aspx,, но единственное решение, которое дано, - это выставить mex на другом порту. Ниже приведены некоторые скриншоты в отражателе, которые показывают разницу между .net 4.0 и 4.5 при расчете значений по умолчанию MaxPendingConnections:

.Net 4.0 ConnectionOrientedTransportBindingElement Calculating default MaxPendingConnections

.Net 4.5 ConnectionOrientedTransportBindingElement Calculating default MaxPendingConnections

.Net 4.5 GetMaxPendingConnections method

14 голосов
/ 23 августа 2012

У меня возникла та же проблема после установки Visual Studio 2012 для оценки.Кажется, что обычная служба и служба mex не могут использовать один и тот же порт, как это было в .NET 4.0, с одним и тем же файлом конфигурации (я не знаю почему, должна быть причина).Вкратце, у меня есть ссылки на служебные клиенты в другой сборке и приложение wpf в другой сборке.Я опубликовал mex с другим портом как этот

<service name="X.XService.XService" behaviorConfiguration="myServiceBehavior">
            <endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IXService" contract="X.XService.IXService">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="net.tcp://localhost:9103/XService/mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:9102/XService" />
                </baseAddresses>
            </host>
        </service>

Моя конфигурация справочной сборки службы

<endpoint address="net.tcp://localhost:9103/XService/mex"
            binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IXService"
            contract="XService.IXService" name="NetTcpBinding_IXService">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>

Наконец моя конфигурация клиентского приложения

    <endpoint address="net.tcp://localhost:9102/XService" binding="netTcpBinding"
            bindingConfiguration="NetTcpBinding_IXService" contract="XService.IXService"
            name="NetTcpBinding_IXService" behaviorConfiguration="endPointBehavior">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
5 голосов
/ 17 марта 2012

Вы уверены, что ваша служба единственная, которая прослушивает порт 13000?

Запустите netstat -noa | find "13000" перед запуском вашей программы, чтобы определить, какой процесс имеет открытый порт 13000.Число в крайнем правом столбце будет идентификатором процесса.

Затем выполните tasklist | find "<pid>" где - идентификатор процесса из предыдущей команды.Это скажет вам, какой процесс имеет 13000 открытых.

4 голосов
/ 17 марта 2012

netsat -anb (требуются права администратора) сообщит вам, что прослушивается на всех портах ... если это ничего не показывает, у вас, вероятно, есть ошибка, когда вы пытаетесь создать конечную точку более одного раза.

2 голосов
/ 26 мая 2012

У вас установлена ​​.Net Framework 4.5 beta? Я видел ту же ошибку при работе на машинах с 4.5, в то время как он отлично работал на 4.0. Но потом он снова работает, если я удалю конечную точку mex.

В моем случае что-то в 4.5 изменениях вызвало такое же сообщение об ошибке. Возможно, была создана автоматическая конечная точка mex или что-то в этом роде.

Не видел ни одного другого приложения, использующего порт, netstat ничего не показывал. Так что это было какое-то самоотречение ...

0 голосов
/ 28 марта 2014

Ну ... мой работал, когда я изменил целевой фреймворк на .Net framework 4. Профиль клиента.

Попробуй ... надеюсь, он тоже будет работать!

...