0

クライアント側では、プロキシの状態を処理して、State==CommunicationState.Faulted のときに自動的に Abort() を呼び出し、CommunicationState.Closed に正常に遷移するようにします。サーバー側では、コールバック チャネルに接続された 2 つのイベントがあります。

OperationContext.Current.Channel.Faulted += Channel_Faulted; OperationContext.Current.Channel.Closed += Channel_Closed;

これが私のイベントコードです

private void Channel_Closed(object sender, EventArgs e)
{
    var callback = sender as IPtiCommunicationCallback;
    PtiClient client;
    lock (syncObj)
    {
        client = clientsList.FirstOrDefault(x => x.Value == callback).Key;
    }
    if (client != null)
    {
        //Code to remove client from the list
        Disconnect(client);
    }
}

private void Channel_Faulted(object sender, EventArgs e)
{
    (sender as ICommunicationObject).Abort();
}

ここで質問があります: デュプレックス チャネル (コールバック チャネル) の状態は、クライアントの状態に応じて自動的に遷移しますか? それとも、私が行ったように障害状態を処理する必要がありますか? ところで、NetTcpBinding を使用しています。

4

2 に答える 2

0

どの種類のバインドを使用する必要があるかについて少し調査した結果、最終的に nettcp バインドを使用することにしました。詳細な説明については、私のブログを参照してください。

http://maheshde.blogspot.com.au/2013/06/duplex-communication-over-internet.html

これらのイベントが発生しなかった理由がわかりません。しかし、クライアントからの WCF 呼び出しを 10 分ごとにトリガーすると、問題は解決しました。

于 2013-08-16T00:28:44.447 に答える
0

通常、Callback チャネルの状態はクライアントの状態を模倣しますが、これは保証されません。たとえば、クライアントが接続を閉じるためにサーバーにアクセスしようとしている場合、その状態は になる可能性がありClosingますが、サーバー側の状態は になる可能性がありますOpened。各側が個別に処理する必要があるClosedと想定して、正しく処理しています。Faulted

于 2013-08-14T20:12:10.507 に答える