質問
WCFサービスを使用しています
クライアント側では、明示的に接続を閉じることを計画しています 閉じる方法は1つ以上あるようです
サンプル1: WCFサービスの使用の最後のブロックで
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
サービスが障害状態にある場合、close()を呼び出すことはできません
Sample2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
sample2では、サービスが障害状態の場合に何が起こるかわかりません。接続を閉じるときにエラーがスローされますか?
解決
「using」を使用した2番目のサンプルブロックが正しくありません。 usingブロックは、プロキシオブジェクトでDisposeメソッドが呼び出されるようにします。 Disposeメソッドは、Closeメソッドを呼び出します。Closeメソッドは、通信状態に障害が発生したときに例外をスローするサービスに接続(試行)します。だからあなたの気持ち/勘は絶対に正しいです。プロキシのDisposeメソッドが最初のサンプルのコードを使用した場合は便利ですが、使用ブロックは使用しないでください:)
他のヒント
必要な情報はすべて手元にあります。WCFクライアントプロキシを使用して適切に閉じる/中止するためのベストプラクティスは次のとおりです。
YourClientProxy clientProxy = new YourClientProxy();
try
{
.. use your service
clientProxy.Close();
}
catch(FaultException)
{
clientProxy.Abort();
}
catch(CommunicationException)
{
clientProxy.Abort();
}
catch (TimeoutException)
{
clientProxy.Abort();
}
FaultExceptionをキャッチすると、サービスがエラー状態になった場合(つまり、チャネルが障害状態になった場合)のすべてのケースが処理され、CommunicationExceptionは、ネットワーク接続のドロップなど、発生する可能性のある他のすべての通信関連の例外を処理します
using()ブロックを使用したアプローチは機能しません。ブロックの最後で例外が発生した場合、Dispose()メソッドがクライアントプロキシでClose()メソッドを呼び出すと、キャッチして処理します。
Juval Lowyの優れた WCFブックのプログラミングが推奨する:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}