1

セッションが有効になっている二重 WCF サービスがあり、クライアントで障害状態の例外を回避しようとしています。

このトピックに関するいくつかの議論を見つけましたが、私が見つけたすべては、クライアント プロキシまたはチャネルを再作成することを示唆しています。非は、セッションが有効な二重サービスに焦点を当てています。

このアプローチの問題点は、サーバーにはクライアントごとに 1 つのセッションがあり、各クライアントにはサービス プロキシ (シングルトン サービス プロキシ) のインスタンスが 1 つしかないことです。二重であるため、クライアント側ではいくつかのオブジェクトがそのサービス インスタンスのイベント (サーバーからクライアントに送信されるメッセージ) をリッスンしています。サービスが障害状態にある場合、それ以上使用することはできません。そのインスタンスを破棄して新しいインスタンスを作成すると、すべてのイベント ハンドラーをこの新しいインスタンスに再度接続するのが難しくなります。

サービスをラップし、オブジェクトがイベントにフックするたびに、ハンドラーをリストに格納する必要があります (サービスが再作成されたときに再フックできるようにするため)。コードが失われているようで、メモリリークしやすい...

すべてのプロキシ インスタンスを破棄せずに、クライアント プロキシ/チャネルを再起動する方法はありますか? (私はVSで生成されたプロキシを使用しています)

何か案は?

ありがとう、MAB

4

1 に答える 1

3

プロキシを再起動できません。障害状態からの唯一の回復は、現在のインスタンスを中止し、新しいインスタンスを再作成することです。クライアント側では、プロキシ インスタンスに依存するすべてを正しく登録解除し、新しいインスタンスを作成して、すべてを再登録する必要があります。障害状態のチャネルに関する例外を取得したら (= サービスを呼び出そうとしたとき)、この操作全体を実行する必要があります。レクリエーションの後、サービスを再度呼び出す必要があります。

サービス側では、インスタンスはすでに停止しているか (チャネルの障害状態の原因)、セッション タイムアウト後に停止します。また、既知のクライアントからチャネルを削除し、そのチャネルに依存するものをすべて登録解除することによって、障害のあるチャネルでコールバックしようとするときに、障害のある例外を処理する必要があります。

于 2011-08-10T08:44:00.073 に答える