我们正在使用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中我不确定如果服务处于故障状态会发生什么,它会在关闭连接时抛出错误吗?
答案 0 :(得分:34)
您掌握了所有必要的信息 - 最终使用和正确关闭/中止所有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将处理可能发生的所有其他与通信相关的异常,例如网络连接丢失等。< / p>
使用using()块的方法将不起作用,因为如果在块的末尾发生异常,当Dispose()方法调用客户端代理上的Close()方法时,您无法抓住并处理它。
答案 1 :(得分:18)
使用“使用”块的第二个样本不正确。 using块确保在代理对象上调用Dispose方法。 Dispose方法依次调用Close方法,该方法将(尝试)连接到服务,当通信状态出现故障时,该方法将引发异常。所以你的感受/预感是完全正确的。如果代理Dispose方法使用了您的第一个示例中的代码,但不是这样,请不要使用using块,这将是很好的。)
答案 2 :(得分:4)
在Juval Lowy的优秀Programming WCF book中,他建议:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}
答案 3 :(得分:2)