クライアント側での WCF サービスの再起動の処理
-
22-09-2019 - |
質問
に対して実行されている GUI クライアントがあります。 WCF サーバー ボックス上で Windows サービスとしてホストされるサービス。WCF サービスは PerCall InstanceContextMode で実行されており、クライアントにはサービス クライアントのシングルトン インスタンスがあり、多くの非同期呼び出しが困難になるため、呼び出しごとにシングルトンを再インスタンス化することは避けたいと考えています。
私にとっての問題は、Windows サービスが再起動された後、クライアントが呼び出しを行うたびに、次のような例外メッセージが表示されることです。
サーバーによるシャットダウンにより出力セッションが自動的に閉じられたため、このチャネルはメッセージの送信に使用できなくなりました。DispatchRuntime.AutomaticInputSessionShutdown を false に設定して自動終了を無効にするか、リモート サーバーでシャットダウン プロトコルを変更することを検討してください。
これを回避する最善の方法は何ですか?サービス クライアントへのすべての呼び出しの周囲に try-catch 句を配置し、通信例外が発生したときにシングルトン インスタンスを再インスタンス化することはできますが、それには多くの定型コードが必要になります。
解決
最善の方法は、サーバー上の例外をすべて回避することです。WCF サーバーがキャッチおよび処理されない例外を検出すると、チャネルに "障害" が発生し、チャネルが役に立たなくなります。
サーバー側では、次のように実装できます。 IErrorHandler インターフェイス .NET 例外をキャッチして、チャネルをフォールトさせることなく、より適切にクライアントに返される SOAP フォールトに変換します。
こうすることで、サーバー上のすべての .NET 例外をキャッチし、それらを相互運用可能な SOAP フォールトに変換することができ、これらの問題が発生しなくなります。
詳細については、以下を参照してください。
他のヒント
あなたはおそらくその定型的なコードの一部を避けるために、これを見てとることができます: