处置/清理Web服务代理

use*_*080 5 c# asp.net webservice-client

同步使用后处理/清理Web服务代理实例的最佳做法是什么?

如何如果代理类是源自于不同的答案SoapHttpClientProtocolClientBase<T>

背景

我试图找出为什么我的一个WCF Web服务有时似乎进入一个不再响应服务调用的状态.基本上它似乎挂了,现在我真的没有任何硬数据来弄清楚发生这种情况时会发生什么.

我怀疑可能存在的一个问题是,这个WCF服务本身正在对其他一些服务进行Web服务调用.使用从SoapHttpClientProtocol(使用wsdl.exe制作)派生的代理调用(同步)这些其他服务,此时这些代理实例将由终结器清理:

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

// process the reponse
...
Run Code Online (Sandbox Code Playgroud)

那么我应该简单地将它们包裹起来using(...) { ... }吗?

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

    // process the reponse
}
...
Run Code Online (Sandbox Code Playgroud)

如果我要ClientBase<T>通过使用重新创建它们来更改这些代理类,该svcutil.exe怎么办?根据我到目前为止的研究,似乎Dipose()派生类的方法ClientBase<T>将在内部调用Close()类的方法,而这个方法可能反过来抛出异常.因此,基于ClientBase<T>a 包装代理Using()并不总是安全的.

所以重申一个问题:

  • 在代理基于何时使用它后,我应该如何清理我的Web服务代理SoapHttpClientProtocol
  • 在代理基于何时使用它后,我应该如何清理我的Web服务代理ClientBase<T>

use*_*080 13

基于找到这个问题的答案我最大的努力,我会说,对于SoapHttpClientProtocol基于代理(常规的.asmx Web服务代理)的正确方法是simly包装在using():

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

    // process the reponse
}
Run Code Online (Sandbox Code Playgroud)

对于基于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;
}
Run Code Online (Sandbox Code Playgroud)