WCF での CommunicationObjectFaultedException からの回復
質問
10 秒ごとに WCF Web サービス経由でメッセージの送信を試行するクライアント アプリがあります。このクライアント アプリは船上のコンピューター上に配置されますが、インターネット接続が不安定になることがわかっています。アプリがサービス経由でデータを送信しようとし、それができない場合は、サービス経由で送信できるようになるまでメッセージをキューに入れたいと考えています。
この設定をテストするために、クライアント アプリと Web サービス (両方ともローカル マシン上) を開始しました。すべてが正常に動作しました。Web サービスを強制終了して再起動することで、インターネット接続の不良をシミュレートしようとします。サービスを強制終了するとすぐに、CommunicationObjectFaultedExceptions が発生し始めますが、これは予想どおりです。しかし、サービスを再起動した後も、引き続き例外が発生します。
Web サービスのパラダイムについて理解していない点があると確信していますが、それが何なのかはわかりません。この設定が実現可能かどうか、可能であればこの問題を解決する方法について誰かアドバイスをいただけますか (例:Web サービスとの通信チャネルを再確立しますか?
ありがとう!
クレイ
解決
クライアント サービス プロキシは、一度障害が発生すると再利用できません。古いものを処分して、新しいものを再作成する必要があります。
また、クライアント サービス プロキシを適切に閉じていることを確認する必要もあります。WCF サービス プロキシが閉じるときに例外をスローする可能性があり、これが発生した場合は接続が閉じられないため、中止する必要があります。「try{Close}/catch{Abort}」パターンを使用します。また、dispose メソッドは close を呼び出す (したがって、dispose から例外をスローする可能性がある) ため、通常の使い捨てクラスと同様に using を使用することはできないことにも注意してください。
例えば:
try
{
if (yourServiceProxy != null)
{
if (yourServiceProxy.State != CommunicationState.Faulted)
{
yourServiceProxy.Close();
}
else
{
yourServiceProxy.Abort();
}
}
}
catch (CommunicationException)
{
// Communication exceptions are normal when
// closing the connection.
yourServiceProxy.Abort();
}
catch (TimeoutException)
{
// Timeout exceptions are normal when closing
// the connection.
yourServiceProxy.Abort();
}
catch (Exception)
{
// Any other exception and you should
// abort the connection and rethrow to
// allow the exception to bubble upwards.
yourServiceProxy.Abort();
throw;
}
finally
{
// This is just to stop you from trying to
// close it again (with the null check at the start).
// This may not be necessary depending on
// your architecture.
yourServiceProxy = null;
}
これに関するブログ記事があります ここ