0

WCFデュプレックスコールバックを使用してクライアントサービスアプリケーションを作成しています。このサービスは、接続されているすべてのクライアントにメッセージを送信します。接続されているすべてのクライアントを辞書に保存しています。クライアントにメッセージを送信する前に、クライアントが異常にシャットダウンしたかどうかを確認したいと思います(ネットワークの切断、電源オフ)。

@marc_s:辞書で接続されているクライアントの通信状態をチェックするCheckCallbackChannelsメソッドを作成しました。

Sub CheckCallbackChannel()
    For Each objClient As KeyValuePair(Of Guid, IClientCallBack) In MainService.objClients
        Dim objClientCallBack As IClientCallBack = MainService.objClients.Item(objClient.Key)
        Dim callbackChannel As ICommunicationObject = TryCast(mobjClientCallBack,ICommunicationObject)
        'Dim state As CommunicationState = callbackChannel.State
        If callbackChannel.State = CommunicationState.Opened OrElse callbackChannel.State = CommunicationState.Faulted Then
            MainService.objClients.Remove(objClient.Key)
        End If
    Next
End Sub

しかし、ここでは、障害のあるクライアントにも接続されている状態を取得します。

4

1 に答える 1

2

はい、Ping()各サービスコントラクトにメソッドを含めて、実際の呼び出しの前にそれを呼び出すことができます。

しかし、それは本当にあなたに何を伝えますか?

まず第一に、への呼び出しでさえ.Ping()例外が発生する可能性があります(サービスがなくなったり、過負荷になったりするため)。

そして、それが成功した場合、マイクロ秒後の同じサービスへの次の呼び出しが成功する可能性があるという保証はまったくありません。

基本的に、このアプローチは無駄だと思います。多くのコードを作成する必要があり、最終的には、意味のある情報が得られません。

あなたがする必要があるのは:それが失敗する可能性のあるすべてのサービスコールに備えてください-何らかの理由で。時間と処理サイクルを無駄にしないでください。システム全体にpingを送信します。とにかく意味のある情報は得られません。

サービスコールを発信し、障害を処理する準備をしてください(そして、場合によってはWCFプロキシをリサイクルしてください)。これで、実際にできることはすべてです。

于 2011-03-03T08:00:17.160 に答える