質問

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();
}

サンプル1を使用

これを使用してはいけない理由に関する良い記事があります:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top