2

私は自分の wcf サービスにこの例を使用しました: http://www.codeproject.com/KB/IP/WCFWPFChatRoot.aspx?msg=3713905#xx3713905xx

しかし、サーバーが停止すると、クライアントはそれを取得できません...

例では次のように処理しました。

proxy.Open();

proxy.InnerDuplexChannel.Faulted += 
  new EventHandler(InnerDuplexChannel_Faulted);
proxy.InnerDuplexChannel.Opened += 
  new EventHandler(InnerDuplexChannel_Opened);
proxy.InnerDuplexChannel.Closed += 
  new EventHandler(InnerDuplexChannel_Closed);

void InnerDuplexChannel_Closed(object sender, EventArgs e)
{
    if (!this.Dispatcher.CheckAccess())
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
                        new FaultedInvoker(HandleProxy));
        return;
    }
    HandleProxy();
}


void InnerDuplexChannel_Faulted(object sender, EventArgs e)
{
    if (!this.Dispatcher.CheckAccess())
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
                        new FaultedInvoker(HandleProxy));
        return;
    }
    HandleProxy();
}

しかし、ホストを停止するか、クラッシュした場合 (ALT + F4)、クライアントはそれを取得しません。接続状態はまだ「接続済み」です。

4

1 に答える 1

2

問題は、基礎となる TCP プロトコルにあります。接続が予期せず切断された場合、TCP は相手にすぐには通知しません。通常、使用されるTCPスタックで最終的に構成できる時間の範囲でタイムアウトがあります-あなたの場合、Windowsレジストリのどこかに。ただし、マシン全体に影響するため、お勧めしません。

ただし、次にその存在しない接続でデータを送信しようとすると、エラーが発生します。

したがって、接続がまだ有効かどうかを知りたい場合は、定期的に小さなメッセージを送信する必要があります。

于 2010-12-29T18:01:28.697 に答える