5

同期使用後に Web サービス プロキシ インスタンスを破棄/クリーンアップするためのベスト プラクティスは何ですか?

SoapHttpClientProtocolプロキシ クラスがvsから派生した場合、答えはどのように異なりますClientBase<T>か?

バックグラウンド

私の WCF Web サービスの 1 つが、サービス呼び出しに応答しなくなった状態になることがある理由を理解しようとしています。基本的にハングしているように見えますが、今のところ、これが発生したときに何が起こっているのかを把握するための確かなデータはありません.

私が問題と考えていることの 1 つは、この WCF サービス自体が他のいくつかのサービスに対して Web サービス呼び出しを行っているという事実です。これらの他のサービスは、(wsdl.exe を使用して作成された) から派生したプロキシを使用して (同期的に) 呼び出さSoapHttpClientProtocolれ、現時点では、これらのプロキシ インスタンスはファイナライザーによってクリーンアップされるために残されます。

...
var testProxy = new TestServiceProxy();
var repsonse = testProxy.CallTest("foo");

// process the reponse
...

では、これらをusing(...) { ... }ブロックにまとめる必要がありますか?

...
using(var testProxy = new TestServiceProxy())
{
    var repsonse = testProxy.CallTest("foo");

    // process the reponse
}
...

ClientBase<T>を使用して再作成することにより、これらのプロキシ クラスをベースに変更するとどうなりsvcutil.exeますか? これまでの私の調査に基づいて、Dipose()から派生したクラスのメソッドがクラスのメソッドClientBase<T>を内部的に呼び出し、Close()このメソッドが例外をスローする可能性があるようです。ClientBase<T>したがって、 aに基づいてプロキシをラップすることUsing()は、必ずしも安全ではありません。

質問を繰り返します:

  • プロキシが に基づいている場合、使用後に Web サービス プロキシをクリーンアップするにはどうすればよいSoapHttpClientProtocolですか?
  • プロキシが に基づいている場合、使用後に Web サービス プロキシをクリーンアップするにはどうすればよいClientBase<T>ですか?
4

1 に答える 1

14

この質問に対する答えを見つけるための最善の努力に基づいて、SoapHttpClientProtocolベースのプロキシ (通常の.asmx Web サービス プロキシ) の正しい方法は、次のように単純にラップすることですusing()

using(var testProxy = new TestAsmxServiceProxy())
{
    var response = testProxy.CallTest("foo");

    // process the reponse
}

ClientBase<T>( WCFプロキシ)に基づくプロキシの場合、答えはusing()ステートメントでラップしないことです。代わりに、次のパターンを使用する必要があります ( msdn リファレンス)。

var client = new TestWcfServiceProxy();
try
{
    var response = client.CallTest("foo");
    client.Close();

    // process the response
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}
于 2013-05-31T10:25:38.783 に答える