11

パブリッシュ/サブスクライブ サーバーとして機能するコールバックを備えた Duplex NetTcp チャネルを使用するシステムを作成しました。

しばらくして接続が送信されない場合、コールバックのタイムアウトを心配する必要がありますか?それとも、コールバック パイプが無期限に維持されますか?

4

1 に答える 1

10

コールバックは無期限に維持されるわけではなく、設定で設定したタイムアウト値を探します。信頼できるセッションを有効にすると、クライアントの非アクティブ タイムアウトを設定できます。次のようにタイムアウトを設定できます。

 <netTcpBinding>
    <binding 
             closeTimeout="00:01:00"
             openTimeout="00:01:00" 
             receiveTimeout="00:10:00" 
             sendTimeout="00:01:00"
             transactionFlow="false" 
           ......>
        <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
    </binding>
  </netTcpBinding>

これらの値に達しても応答がない場合は、通信チャネルに障害が発生し、サービスを利用するためにクライアント プロキシを再作成する必要があります。のデフォルト値は 10 分なので、それを増やすことができますが、同様にあなたのreceiveTimeout時間を増やすことも忘れないでください。inactivityTimeoutinactivityTimeoutreceiveTimeout

編集:

receiveTimeoutクライアントがサーバーに送り返す値に基づいてプログラムで変更し続けることができます。重要なのは、サービスとクライアントで新しいタイムアウト値を同じに保つことです。クライアントでこれを実行します (WCF で作成し、Silverlight クライアントで使用しているチャット サービスから取った例です)。

//Create different clients dynamically
MyChatServiceClient _client1 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_1");
MyChatServiceClient _client2 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_2");

クライアント構成:

<!--In your config file, define multiple endpoints/behaviors with different values based on your needs-->
        <bindings>
            <customBinding>
                <binding name="NetTcpBinding_IMyChatService_1" receiveTimeout="00:01:00" ...>
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="283647" maxBufferSize="283647" />
                </binding>
                <binding name="NetTcpBinding_IMyChatService_2" receiveTimeout="00:22:00" ...>
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://192.168.1.51:4520/VideoChatServer/"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_1"
                contract="IMyChatService" name="NetTcpBinding_IMyChatService_1" />

          <endpoint address="net.tcp://192.168.1.51:4522/VideoChatServer/"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_2"
                contract="IMyChatService" name="NetTcpBinding_IMyChatService_2" />
        </client>

したがって、クライアントまたはサーバーの構成で複数のエンドポイントまたはバインディングを定義できます。次に、アプリケーションのイベントに基づいて、_clientProxyX をインスタンス化して _serviceInstanceX を消費できます。これは、バインディング/エンドポイントの値は異なりますが、以前のサービス インスタンスと同じコントラクトを持ちます。 . 上記の例では、最初のバインディングのタイムアウトは 1 分で、2 番目のバインディングのタイムアウトは 2 分です。考慮すべき重要な点は、このように新しいクライアント プロキシを再作成する場合は、古いクライアント プロキシを破棄して新しいクライアント プロキシを作成する必要があるということです。これにより、少なくとも一時的にクライアントがサービスから効果的に切断されます。

また、新しいサービス ホストをインスタンス化するときに、両方のサーバーでこれらの値 ( など) をプログラムで変更することもできopenTimeoutます。closeTimeout構成で定義したバインディング構成の 1 つに基づいて新しいホストを作成するか、次のようにプログラムで新しい構成を作成できます。

var host = new ServiceHost(typeof(MyChatService));
            var webHttpBinding = new System.ServiceModel.WebHttpBinding();
            //Modify new timeout values before starting the host
            webHttpBinding.OpenTimeout = new TimeSpan(1, 0, 0);
            webHttpBinding.CloseTimeout = new TimeSpan(1, 0, 0);
            host.AddServiceEndpoint(webHttpBinding, "http://192.168.1.51/myService.svc");
            //start the host after necessary adjustments
            host.Open();

これは非常に面倒に見えますが、要点は、WCF を使用すると、バインド構成をプログラムで変更できる柔軟性が大幅に向上することです。WCF 構成ファイルの変更に関するこの素晴らしい回答を必ず確認してください。また、サービス構成全体をプログラムで簡単に作成することもできます。

于 2012-05-14T15:51:08.223 に答える