我们正在使用WCF服务
在客户端,我们计划明确地关闭它似乎有结束的多于一个的方式连接
样本1:在WCF服务消费使用finally块
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
因为如果服务处于故障状态,我们将无法调用close()
样品2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
在SAMPLE2我不知道,如果服务处于故障状态会发生什么,将它抛出错误关闭连接?
使用“使用”块中的第二样品是不正确。 using块确保Dispose方法被称为代理对象上。 反过来Dispose方法调用Close方法将(尝试)连接时的通信状态发生故障,这将引发异常的服务。 所以,你的感受/直觉是绝对正确的。 如果代理Dispose方法从第一个样品使用的代码,但它并没有那么不使用using块这将是不错:)
你手头所有必要的信息 - 生成的最佳实践使用和妥善关闭/中止所有的WCF客户端代理将是:
YourClientProxy clientProxy = new YourClientProxy();
try
{
.. use your service
clientProxy.Close();
}
catch(FaultException)
{
clientProxy.Abort();
}
catch(CommunicationException)
{
clientProxy.Abort();
}
catch (TimeoutException)
{
clientProxy.Abort();
}
凤云的FaultException处理所有的情况下,当服务与错误条件responsded(因此您的频道处于故障状态),并会的CommunicationException处理所有可能发生的其他通信相关的异常,如网络连接等下降
与使用()块中的做法是行不通的,如果有异常发生在块,当Dispose()方法调用Close()方法在客户端代理的结束,因为,你有没有办法捕捉和处理那。
在朱瓦尔·洛的优秀编程WCF的书 ,他建议:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}
使用样品1
这里是为什么你不应该使用使用一个很好的文章:
http://msdn.microsoft.com/en-us/library/aa355056.aspx