关闭WCF连接

Bal*_*aji 27 connection wcf

我们正在使用WCF服务

在客户端,我们计划明确关闭连接似乎有更多的关闭方式

Sample1:在WCF服务使用的finally块中使用

if (client.State == CommunicationState.Faulted)
{
  client.Abort();
}
client.Close();
Run Code Online (Sandbox Code Playgroud)

因为如果服务处于故障状态,我们将无法调用close()

样品2:

using(ClientProxy proxy = new ClientProxy())
{   
  //call your service methods
}
Run Code Online (Sandbox Code Playgroud)

在sample2中我不确定如果服务处于故障状态会发生什么,它会在关闭连接时抛出错误吗?

mar*_*c_s 34

您掌握了所有必要的信息 - 使用并正确关闭/中止所有WCF客户端代理的最佳实践将是:

YourClientProxy clientProxy = new YourClientProxy();

try
{
   .. use your service
   clientProxy.Close();
}
catch(FaultException)
{
   clientProxy.Abort();
}
catch(CommunicationException)
{
   clientProxy.Abort();
}
catch (TimeoutException)
{ 
   clientProxy.Abort();
}
Run Code Online (Sandbox Code Playgroud)

捕获FaultException会处理服务响应错误条件(因此您的通道处于故障状态)的所有情况,并且CommunicationException将处理可能发生的所有其他与通信相关的异常,例如网络连接丢失等.

使用using()块的方法不起作用,因为如果在块的末尾发生异常,当Dispose()方法调用客户端代理上的Close()方法时,您无法捕获和处理那.


oll*_*lle 18

使用"使用"块的第二个样本不正确.using块确保在代理对象上调用Dispose方法.Dispose方法依次调用Close方法,该方法将(尝试)连接到服务,当通信状态出现故障时,该方法将引发异常.所以你的感受/预感是完全正确的.如果代理Dispose方法使用了您的第一个示例中的代码,但不是这样,请不要使用using块:)