6

最近、新しい.NET Framework 4.5(以前は4.0がインストールされていました)をサーバーにインストールしましたが、System.ServiceModel.AddressAlreadyInUseExceptionWCFエンドポイントを公開するWindowsサービスを起動するとが表示されます。

System.ServiceModel.AddressAlreadyInUseException:IPエンドポイント0.0.0.0:56543に既にリスナーがあります。これは、このエンドポイントで既にリッスンしている別のアプリケーションがある場合、またはサービスホストに同じ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。 ServiceModel.Channels。
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) System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)atSystem。Qosit.Infrastructure.UnisServer.OnStart(String [] args)でのServiceModel.Channels.CommunicationObject.Open(TimeSpanタイムアウト)

WCFエンドポイントの構成は次のようになります。

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBindingConfiguration" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
          <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="MEX">
          <serviceMetadata/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MEX" name="MyAssembly.MyNamespace.MyService">      
        <endpoint address="net.tcp://localhost:56543/MyService"
          binding="netTcpBinding" bindingConfiguration="NetTcpBindingConfiguration" contract="MyAssembly.MyNamespace.MyServiceInterface" />
        <endpoint address="net.tcp://localhost:56543/MEX" binding="mexTcpBinding"
          contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

同じポートを使用するMEXエンドポイントと関係があると思いますが、.NETFramework4.5にアップグレードした後で正しく構成する方法がわかりません。

これらの構成で例外が発生するようにWCFに変更がありましたか?

4

2 に答える 2

16

これは、ここに記載されているnetTcpエンドポイントとmexエンドポイントの両方に同じポートを使用する際のいくつかの制限のためです。「NetTcpBindingを使用したサービスエンドポイントとmexエンドポイント間のポートの共有」のセクションを参照してください。4.0では、listenBackLogおよびのデフォルトMaxConnectionsは10でした。4.5では、これらのデフォルトは12*ProcessorCountとして改訂されました。この例外は、netTcpBindingとmexエンドポイントの間でポートを共有しようとしたときに発生します。ただし、これら2つのプロパティの値が異なる場合に限ります。4.0では、これらをデフォルト値(10)に設定しているため、これは正常に機能しました。したがって、これらの設定は両方のエンドポイントで異なりません。ただし、4.5では、これらはnetTcpエンドポイントでは10のままですが、12*ProcessorCountとして計算されます。だから例外。

この問題を解決するには、2つの方法があります。

  1. listenBackLogこれらの設定(およびMaxConnections)を構成から削除します。このようにして、デフォルトの12*プロセッサ数が自動的に取得されます。これはデフォルトの4.0を超えています。
  2. ドキュメントで説明されているように、別のポートでmexエンドポイントを構成する回避策に従ってください

詳細については、このブログをチェックしてください。

于 2012-10-16T19:50:18.410 に答える
0

コンソールアプリケーションでWCFサービスをホストする場合は、App.configファイルをWCFプロジェクトからコンソールアプリにコピーしてから、App.configファイルをWCFプロジェクトから削除する必要があります。削除しない場合は、上記のエラー。

于 2016-02-27T11:18:04.493 に答える