use*_*080 5 c# asp.net webservice-client
同步使用后处理/清理Web服务代理实例的最佳做法是什么?
如何如果代理类是源自于不同的答案SoapHttpClientProtocol对ClientBase<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()并不总是安全的.
所以重申一个问题:
SoapHttpClientProtocol?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)