WCFサービスを使用しています
クライアント側では、接続を明示的に閉じることを計画しています。閉じる方法は複数あるようです。
サンプル1:WCFサービス消費の最後のブロックで使用
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
サービスが障害状態にある場合、close()を呼び出すことができないため
サンプル2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
sample2では、サービスが障害状態の場合に何が起こるかわかりませんが、接続を閉じるときにエラーがスローされますか?
「using」ブロックを使用した2番目のサンプルは正しくありません。 usingブロックは、プロキシオブジェクトでDisposeメソッドが呼び出されるようにします。次に、DisposeメソッドはCloseメソッドを呼び出します。このメソッドは、通信状態に障害が発生したときに例外をスローするサービスに接続しようとします。だからあなたの気持ち/予感は絶対に正しいです。プロキシのDisposeメソッドが最初のサンプルのコードを使用した場合は便利ですが、usingブロックは使用しないでください:)
必要なすべての情報が手元にあります。すべての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は、ネットワーク接続の切断など、発生する可能性のある他のすべての通信関連の例外を処理します。
ブロックの最後で例外が発生した場合、Dispose()メソッドがクライアントプロキシでClose()メソッドを呼び出すと、キャッチして処理する方法がないため、using()ブロックを使用したアプローチは機能しません。それ。
Juval LowyのExcellent Programming WCF book 彼は次のことを推奨しています:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}