关闭 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大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接