我们正在使用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会处理服务响应错误条件(因此您的通道处于故障状态)的所有情况,并且CommunicationException将处理可能发生的所有其他与通信相关的异常,例如网络连接丢失等。

使用using()块的方法将不起作用,因为如果在块的末尾发生异常,当Dispose()方法调用客户端代理上的Close()方法时,您无法抓住并处理它。

在Juval Lowy的优秀编写WCF书籍他建议:

try 
{
    ClientProxy clientProxy = new ClientProxy();
    clientProxy.SomeMethod();
    clientProxy.Close();
}
catch
{
    proxy.Abort();
}

使用样本1

这是一篇很好的文章,说明为什么你不应该使用:

http://msdn.microsoft.com/en-us/library /aa355056.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top