关闭 WCF 连接

Posted

技术标签:

【中文标题】关闭 WCF 连接【英文标题】:Closing WCF connection 【发布时间】: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中我不确定如果服务处于故障状态会发生什么,它会抛出错误关闭连接吗?

【问题讨论】:

@Balaji-看看这篇文章-***.com/questions/573872/…。这是最有帮助的 【参考方案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

【讨论】:

以上是关于关闭 WCF 连接的主要内容,如果未能解决你的问题,请参考以下文章

WCF 中的远程主机强制关闭现有连接

底层连接在 WCF 中使用序列化程序关闭

WCF 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。

WCF 超时太快和“连接意外关闭”异常

解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接

WCF客户端可以关闭与服务的链接吗,让软件也可以照常运用,现有的只有打包好的软件和配置文件