如果出现故障,如何自动重新建立双工通道?
Posted
技术标签:
【中文标题】如果出现故障,如何自动重新建立双工通道?【英文标题】:How do I automatically re-establish a duplex channel if it gets faulted? 【发布时间】:2010-09-17 07:03:57 【问题描述】:我正在使用 WCF 在 .Net 3.5 中开发客户端/服务器应用程序。基本上,长时间运行的客户端服务(在多台机器上)通过 netTcpBinding 建立到服务器的双工连接。然后服务器使用客户端的回调合约来执行某些按需操作,客户端以异步方式响应(我认为这是相当标准的东西)。我继承了 DuplexClientBase 类来处理大部分通信。
不幸的是,当任一端出现问题(例如网络故障、意外异常等)时,通道会出现故障/中止,并且所有后续操作都会失败。我通过创建一个 RecoveringClientBase 类解决了非双工通道中的这个限制,该类会在客户端出现故障时自动恢复并重试操作。
所以我的问题是,是否有确定双工通道何时出现故障的既定方法?我应该在哪里检查这个,在服务器或客户端上?如果做不到这一点,我必须有哪些选项来确保重新建立连接?
更新:我正在寻找一些针对双工通道的建议,其中服务器可能会尝试使用出现故障的回调通道。因此,我需要在频道发生问题时立即重新连接/重新订阅的东西。目前,我正在收听频道的 Closing 事件,如果状态不是已关闭,则重新创建它。它有点工作,但感觉很hacky......
【问题讨论】:
【参考方案1】:我在长时间运行(几分钟到几小时)的过程中经历了片状。我不能确定它是 WCF,我很确定它的网络级别。
我正在考虑完全取消双工。尝试管理连接状态确实很麻烦。
我正在考虑在客户端上为当前属于回调合同一部分的操作托管一个服务端点。客户端将使用端点详细信息联系服务器,服务器可以将这些存储在某处(持久或任何地方)。当服务器需要联系客户端时,它会通过隐藏的端点详细信息打开与客户端的连接。基本上,将双工连接变成 2 个客户端-服务器连接。
没有回答你的问题,但我能感受到你的痛苦。
【讨论】:
我想,这种技术不能用于 NAT 后面的客户端【参考方案2】:WCF 团队的 Nicolas Allen 对此提出了建议:
http://blogs.msdn.com/drnick/archive/2007/11/05/custom-transport-retry-logic.aspx
他的建议是在渠道层面处理这个问题。通道级别更好一些,因为您可以通过行为将其插入任何绑定的堆栈,而不需要自定义客户端基类。
【讨论】:
您能举个例子吗?这篇文章只是提出了这个想法,但没有给出实现的任何线索。 +1 雅各布。有没有人知道如何使这项工作的任何信息?我目前不得不求助于使用城堡动态代理来实现我的重新连接行为,但我更愿意通过 Wcf 添加这种行为。我正在阅读各种 Wcf 博客,但它难以理解,我不知道从哪里开始——即使是简单的扩展似乎也需要创建大量的类和大量的配置——这令人费解。 通过服务上的显式 ICommunicationObject 接口将事件处理程序添加到故障事件。在事件处理程序中,Abort() 通道并创建一个新通道。【参考方案3】:我遇到过一些类似的问题,在我看来,这些长时间运行的调用或多或少不受支持。
WCF 似乎被设计为用于短时间运行的调用。服务,被调用,做一些小事情,然后完成。
我将我的应用程序重构为更小的工作项。因此,我现在得到了许多较小的项目,而不是一件长期运行的大型项目。 当然,有时这是不可能实现的。然后我要祈祷网络连接稳定(可以捕捉到异常,所以我认为故障不是问题)。
【讨论】:
【参考方案4】:我认为你真的应该听听错误事件。 你可以在两端听,客户端我想你已经在处理了,服务器端是 OperationContext.Current.Channel.events。
我还没有找到自动重新发送消息的方法,因为您的回调通道已经出现故障并且您还不知道新的回调通道,但需要将这些调用保留在服务器的某个位置,直到客户端重新连接。
客户端最终会出现故障,应该重新与服务器握手,这是点服务器应该发出未发送的调用。
基本上,从故障/关闭通道中恢复的唯一方法是将其替换为新通道,但是,最关键的部分是您应该真正检测到断开连接 ON TIME,我发现启用可靠会话将按时引发故障事件大多数情况。或者,您可以在两端发送心跳消息到“测试”通道故障。
【讨论】:
以上是关于如果出现故障,如何自动重新建立双工通道?的主要内容,如果未能解决你的问题,请参考以下文章