web-dev-qa-db-ja.com

IPエンドポイント0.0.0.0:13000にはすでにリスナーがあります。 ?? (WCFを使用したTCP)

コンピュータを再起動した後でも、なぜポートが使用されているのかを理解しようとしています!

System.ServiceModel.AddressAlreadyInUseException:IPエンドポイント0.0.0.0:13000に既にリスナーがあります。これは、このエンドポイントで既にリッスンしている別のアプリケーションがある場合、またはサービスホストに同じIPエンドポイントを持つが互換性のないバインディング構成を持つ複数のサービスエンドポイントがある場合に発生する可能性があります。 ---> System.Net.Sockets.SocketException:通常、システムのSystem.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot、SocketAddress socketAddress)では、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)の使用が1回だけ許可されます。 Net.Sockets.Socket.Bind(EndPoint localEP)at System.ServiceModel.Channels.SocketConnectionListener.Listen()---内部例外スタックトレースの終了--- System.ServiceModel.Channels.SocketConnectionListener.Listen()atSystem。 System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen()のSystem.ServiceModel.Channels.ConnectionAcceptor.StartAccepting()のSystem.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)のServiceModel.Channels.TracingConnectionListener.Listen() System.ServiceModel.Channels.TcpChannelListener`2.OnOpen(TimeSpan timeout)at System.ServiceModel.Channels.CommunicatのServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)システムのSystem.ServiceModel.ServiceHostBase.OnOpen(TimeSpanタイムアウト)のSystem.ServiceModel.Channels.CommunicationObject.Open(TimeSpanタイムアウト)のSystem.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpanタイムアウト)のionObject.Open(TimeSpanタイムアウト)。 Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)のServiceModel.Channels.CommunicationObject.Open(TimeSpanタイムアウト)System.Net.Sockets.SocketException(0x80004005):各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)の使用は1回のみ)は通常、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>
17
LB.

.Net 4.5をインストールした後にこの問題が発生し、他の人が遭遇した場合に役立つ解決策をここに投稿しています。上記の@berkaykの回答は機能しましたが(別のポートでmexを公開)、同じポートを介して両方のエンドポイントを公開する必要がありました。

2つのエンドポイントがあり、1つはnetTcpBindingを使用し、もう1つはmexTcpBindingを使用するとします。デフォルトのバインディングを使用する場合、デフォルトの一部は、.Net 4.0のようにハードコードされた値ではなく、OSEnvironmentHelper.ProcessorCountを使用して計算されます。

私の場合、名前付きnetTcpBinding bindingConfigurationを使用する場合、MaxConnectionsプロパティに指定された値は20でした。NetTcpBindingでMaxConnectionsプロパティを設定すると、TcpTransportBindingElementのMaxPendingConnectionsプロパティとTcpTransportのConnectionPoolSettings.MaxOutboundConnectionsPerEndpointプロパティも同じ値に設定されます。

名前付きnetTcpBindingbindingConfigurationを使用せず、デフォルトのみを使用する場合、MaxPendingConnectionsプロパティは次のアルゴリズムを使用して計算されました。

 return (12 * OSEnvironmentHelper.ProcessorCount);

MexTcpBindingのトランスポートは、上記のアルゴリズムを使用してMaxPendingConnectionsプロパティも計算したため、どちらも名前付きbindingConfigurationを使用していない場合、デフォルト値が一致し、問題はありません。

名前付きnetTcpBindingbindingConfigurationを使用した場合、トランスポートのMaxPendingConnectionsは20であり、mexTcpBindingのトランスポートのMaxPendingConnectionsは私のマシンでは96でした。同じポートを共有するこれら2つのエンドポイント間のMaxPendingConnectionsの値の違いには互換性がありません。

また、この問題は、ListenBacklogセットでも発生したことがわかりました。 (存在する可能性のあるすべての競合する値を知りません。)

この問題を解決するために、netTcpBindingの名前付きbindingConfigurationと一致するmexのカスタムバインディングを作成できます。以下の例:

<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など)を指定してデフォルトを受け入れることはできません(MaxPendingConnectionsプロパティと同じ方法で計算されないため、MaxOutboundConnectionsPerEndpointはデフォルト値の10を保持することに注意してください)。

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

注:この問題の説明は次のとおりです: http://msdn.Microsoft.com/en-us/library/aa702636.aspx ただし、与えられた唯一の解決策は、別のポートでmexを公開することです。以下は、MaxPendingConnectionsのデフォルトを計算するときの.net4.0と4.5の違いを示すリフレクターのスクリーンショットです。

.Net 4.0 ConnectionOrientedTransportBindingElement Calculating default MaxPendingConnections

.Net 4.5 ConnectionOrientedTransportBindingElement Calculating default MaxPendingConnections

.Net 4.5 GetMaxPendingConnections method

29
dugas

評価のためにVisualStudio 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>
14
berkayk

ポート13000をリッスンしているのはあなたのサービスだけですか?

プログラムを開始する前にnetstat -noa | find "13000"を実行して、ポート13000が開いているプロセスを特定します。右端の列の番号がプロセスIDになります。

次に、tasklist | find "<pid>"を実行します。ここで、は前のコマンドのプロセスのIDです。これにより、13000が開いているプロセスがわかります。

6
villecoder

netsat -anb(管理者権限が必要)は、すべてのポートで何をリッスンしているかを示します...それでも何も表示されない場合は、エンドポイントを複数回作成しようとしているバグがある可能性があります。

4
Yaur

.Net Framework 4.5ベータ版がインストールされていますか? 4.0で完全に実行されていたのに、4.5のマシンで実行した場合にも同じエラーが発生しました。しかし、mexエンドポイントを削除すると、再び機能します。

私の場合、4.5の変更で何かが同じエラーメッセージを引き起こしました。たぶん、自動mexエンドポイントが作成されたか何か。

ポートを使用している他のアプリも表示されませんでした。netstatは何も表示しませんでした。それで、それはある種の自己否定でした...

2
Per Salmi