web-dev-qa-db-ja.com

WCF接続を閉じる

WCFサービスを使用しています

クライアント側では、接続を明示的に閉じることを計画しています。閉じる方法は複数あるようです。

サンプル1:WCFサービス消費の最後のブロックで使用

if (client.State == CommunicationState.Faulted)
{
  client.Abort();
}
client.Close();

サービスが障害状態にある場合、close()を呼び出すことができないため

サンプル2:

using(ClientProxy proxy = new ClientProxy())
{   
  //call your service methods
}

sample2では、サービスが障害状態の場合に何が起こるかわかりませんが、接続を閉じるときにエラーがスローされますか?

27
Balaji

「using」ブロックを使用した2番目のサンプルは正しくありません。 usingブロックは、プロキシオブジェクトでDisposeメソッドが呼び出されるようにします。次に、DisposeメソッドはCloseメソッドを呼び出します。このメソッドは、通信状態に障害が発生したときに例外をスローするサービスに接続しようとします。だからあなたの気持ち/予感は絶対に正しいです。プロキシのDisposeメソッドが最初のサンプルのコードを使用した場合は便利ですが、usingブロックは使用しないでください:)

18
olle

必要なすべての情報が手元にあります。すべての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()ブロックを使用したアプローチは機能しません。それ。

34
marc_s

Juval LowyのExcellent Programming WCF book 彼は次のことを推奨しています:

try 
{
    ClientProxy clientProxy = new ClientProxy();
    clientProxy.SomeMethod();
    clientProxy.Close();
}
catch
{
    proxy.Abort();
}
4
RichardOD

サンプル1を使用

を使用してはいけない理由についての良い記事があります:

http://msdn.Microsoft.com/en-us/library/aa355056.aspx

2
Shiraz Bhaiji