【问题标题】:Closing WCF connection关闭 WCF 连接
【发布时间】:2010-11-26 20:47:39
【问题描述】:

我们正在使用 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中我不确定如果服务处于故障状态会发生什么,它会抛出错误关闭连接吗?

【问题讨论】:

标签: wcf connection


【解决方案1】:

您手头有所有必要的信息 - 使用和正确关闭/中止所有 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() 方法时,您将无法捕捉并处理它。

【讨论】:

  • 感谢大家的回复。我希望 web.config 文件中有一些设置来处理连接关闭!
  • FaultException 是 CommunicationException,因此从技术上讲,您不需要两个 catch 子句(除非您计划以不同方式处理这两种情况)。
  • FaultException 是 CommunicationException 的后代,你是对的 - 只要处理 CommunicationException 就可以了,只要你不需要为两种不同的情况做不同的事情。猜猜我的习惯是单独列出最常发生的异常类型,即使我没有对它们做任何特别的事情.....
  • @BrentArias:请不要在我的回答中添加这么大的陈述-如果您还有话要说,您可以随时添加自己的答案以进一步解释我的意思一直在说。谢谢。
【解决方案2】:

使用“使用”块的第二个示例不正确。 using 块确保在代理对象上调用 Dispose 方法。 Dispose 方法依次调用 Close 方法,该方法将(尝试)连接到服务,该服务将在通信状态出现故障时引发异常。所以你的感觉/预感是绝对正确的。如果代理 Dispose 方法使用您的第一个示例中的代码,那就太好了,但不要使用 using 块:)

【讨论】:

    【解决方案3】:

    在 Juval Lowy 的优秀 Programming WCF book 他推荐:

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

    【讨论】:

    • 哈..我在书中看到了该代码,但我认为它无法编译。该服务必须在 try 块之外声明才能在 catch 块中访问...然后您可能希望对其进行空检查。
    • @foson- 你知道它在哪个页面上吗?你对上面的代码是正确的。我有这本书,但现在读了一段时间。
    【解决方案4】:

    使用示例 1

    这是一篇关于为什么不应该使用 using 的好文章:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2013-12-22
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多