6

私は2つのアプリケーションを使用しています。1つはnet.tcpバインディングを使用するように構成されたセルフホストサービスを備えています。サービスのServiceBehaviorAttributeは、次のように構成されます。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
                 InstanceContextMode = InstanceContextMode.Single,
                 IncludeExceptionDetailInFaults = true,
                 UseSynchronizationContext = false,
                 ValidateMustUnderstand = false)]

サービスとクライアントの両方で、transferModeはStreamedに設定され、タイムアウトは次のとおりです。

closeTimeout="00:01:00"
openTimeout="00:00:30"
receiveTimeout="00:02:30"
sendTimeout="00:02:30"

MaxConnectionsは500に設定され、ServiceThrottlingBehaviorはWCF4のデフォルト値を使用します。

  • MaxConcurrentSessions:100 * ProcessorCount
  • MaxConcurrentCalls:16 * ProcessorCount
  • MaxConcurrentInstances:デフォルトは、上記の2つの合計であり、以前と同じパターンに従います。

クアッドコアマシンを使用していて、Net.Tcpポート共有サービスが有効になっています。

クライアントアプリケーションには、ChannelFactoryクラスを使用して作成されたサービスへの単一のチャネルがあります。チャネルが作成されると、100個のスレッドが生成されます。各スレッドはチャネルを使用して、1秒あたり1メッセージの頻度でサーバーにメッセージを送信します。

数秒実行すると(クライアントはサーバーにメッセージを送信し、正しく受信します)、EndpointNotFoundExceptionがスローされて次のメッセージが表示されます。

Could not connect to net.tcp://localhost/service. The connection attempt lasted 
for a time span of 00:00:02.1777100. TCP error code 10061: No connection could 
be made because the target machine actively refused it 127.0.0.1:808.

奇妙なことは次のとおりです。

  • 同じマシンで両方のアプリケーションを実行した場合、例外の期間は約2秒ですが、自分のマシンでサーバーアプリケーションを実行し、別のマシンでクライアントアプリケーションを実行した場合、例外の期間は常に1秒です。
  • 場合によっては(10分の1のように)、例外がスローされず、両方のアプリケーションが正常に動作します。
  • 例外がスローされる前に、サーバーはメッセージを受信して​​正しく処理します。サーバーでは例外はスローされません。

私は多くのテストを行い、スレッドの量を減らし、増やし、閉じる、開く、受信と送信のタイムアウトをより低い値とより高い値に変更し、maxConnectionsに高い値を設定しましたが、結果は常に同じです。 EndpointNotFoundExceptionがスローされます。私はコードをあきらめて変更しようとしているので、これで問題が解決することを期待して各スレッドに独自のチャネルがありますが、なぜこれが発生するのか知りたいです。誰かが私が間違っていることを知っているか、調査を続けるために私を正しい方向に向けることができるなら、それは役に立ちます。

4

1 に答える 1

1

デフォルトでは、Windows はポート共有を有効にしません。適切に有効になっていることを確認します(こちらを参照)。

可能であれば、1 つのアプリケーションのポートを変更するか、VM 内で 1 つのポートをテストすることもできます。

また、同じ問題を抱えている可能性のある他の人のために、ディエゴが行ったように、構成でポート共有が有効になっていることを確認してください。portSharingEnabled="true"バインディングに追加します。

<system.serviceModel>
  <bindings>
    <netTcpBinding name="portSharingBinding" 
                   portSharingEnabled="true" />
  <services>
    <service name="MyService">
        <endpoint address="net.tcp://localhost/MyService"
                  binding="netTcpBinding"
                  contract="IMyService"
                  bindingConfiguration="portSharingBinding" />
    </service>
  </services>
</system.serviceModel>

出典: http://msdn.microsoft.com/en-us/library/ms731810.aspx

于 2012-04-12T15:59:31.777 に答える