2011-08-10 10 views
0

セッションを有効にしたデュプレックスWCFサービスがあり、クライアントでフォールト状態の例外を回避しようとしています。セッションを有効にしたWCFデュプレックスサービスで障害状態を処理する方法

このトピックについてはいくつかの議論がありましたが、私が見つけたのはクライアントプロキシまたはチャネルを再作成することだけです。 Nonは、セッションが有効なデュプレックスサービスに焦点を当てています。

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

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

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

アイデア?

おかげで、あなたがプロキシを再起動することはできません MAB

答えて

2

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

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

+0

悪いニュース、私は それにもかかわらず、これが有効になってセッションとサービスを使用するすべてのアプリケーションに取り組むことが必要なもののようです:-(すべてのことをコーディングする必要があります。 誰もが私ができるいくつかのライブラリを知ってい再使用? – Matias

関連する問題