Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如果双工通道出现故障,如何自动重新建立双工通道?_.net_Wcf_Duplex_Fault Tolerance - Fatal编程技术网

.net 如果双工通道出现故障,如何自动重新建立双工通道?

.net 如果双工通道出现故障,如何自动重新建立双工通道?,.net,wcf,duplex,fault-tolerance,.net,Wcf,Duplex,Fault Tolerance,我正在使用WCF在.NET3.5中开发一个客户机/服务器应用程序。基本上,长时间运行的客户端服务(在多台机器上)通过NetCPBinding建立到服务器的双工连接。然后,服务器使用客户机的回调契约执行某些按需操作,客户机以异步方式响应这些操作(我认为这是相当标准的)。我将DuplexClientBase类划分为子类来处理大部分通信 不幸的是,当任何一端出现错误(如网络故障、意外异常等)时,通道会出现故障/中止,所有后续操作都会失败。我通过创建一个RecoveringClientBase类绕过了非

我正在使用WCF在.NET3.5中开发一个客户机/服务器应用程序。基本上,长时间运行的客户端服务(在多台机器上)通过NetCPBinding建立到服务器的双工连接。然后,服务器使用客户机的回调契约执行某些按需操作,客户机以异步方式响应这些操作(我认为这是相当标准的)。我将DuplexClientBase类划分为子类来处理大部分通信

不幸的是,当任何一端出现错误(如网络故障、意外异常等)时,通道会出现故障/中止,所有后续操作都会失败。我通过创建一个RecoveringClientBase类绕过了非双工通道中的这一限制,该类在客户端出现故障时自动拾取并重试操作

所以我的问题是,是否有一种确定双工通道何时出现故障的既定方法?我应该在哪里检查,在服务器上还是在客户机上?如果失败,我有什么选择来确保重新建立连接


更新:我正在寻找一些针对双工通道的建议,服务器可能会尝试使用出现故障的回调通道。因此,当频道出现问题时,我需要能够立即重新连接/重新订阅的东西。目前,我正在收听频道的关闭事件,如果状态不是关闭的,则重新创建它。这是一种工作方式,但感觉很粗糙……

来自WCF团队的尼古拉斯·艾伦对此提出了建议:


他的建议是在渠道层面处理这一问题。通道级别稍微好一点,因为您可以通过行为将其插入任何绑定的堆栈,而不需要自定义客户端基类。

我也遇到过一些类似的问题,对我来说,这些长时间运行的调用似乎或多或少是不受支持的

WCF似乎设计用于短时间运行的呼叫。被呼叫的服务,做一些小事情,然后完成

我将应用程序重构为更小的工作项。因此,我现在得到的不是一个大的长跑项目,而是很多小项目。
当然,有时这是不可能实现的。然后我要祈祷稳定的网络连接(可以捕捉到异常,所以我认为故障并不是一个真正的问题)。

我在长时间运行的会话(分钟-小时)中遇到了片状问题。我不能确定它是WCF,我很确定它的网络级别

我正在考虑彻底废除双工制。试图管理连接的状态真是讨厌

我正在考虑在客户机上托管一个服务端点,用于当前属于回调契约一部分的操作。客户机将与服务器联系并提供端点详细信息,服务器可以将这些信息存储在某个位置(持久化或任何位置)。当服务器需要联系客户机时,它会通过隐藏的端点详细信息打开与客户机的连接。基本上,将双工连接转换为2个客户机-服务器连接


没有回答你的问题,但我感觉到了你的痛苦。

我认为你真的应该听听这件事。 你们可以在两端监听,客户端我想你们已经在处理了,服务器端是OperationContext.Current.Channel.events

我还没有找到自动重新发送消息的方法,因为您的回调通道已经出现故障,并且您还不知道新的回调通道,但需要将这些调用保留在服务器的某个位置,直到客户端重新连接

客户端最终会出现故障,应该重新与服务器握手,这是服务器应该发送未发送呼叫的点


基本上,从故障/关闭的通道恢复的唯一方法是用新通道替换它,但是,最关键的部分是您应该真正及时检测断开连接,我发现在大多数情况下,“启用可靠会话”将及时引发故障事件。或者,您可以在两端发送心跳消息以“测试”出现故障的通道。

您是否可以提供一个示例?这篇文章只是提出了这个想法,但没有给出实施的线索。有人知道怎么做吗?我目前不得不使用castle dynamic proxy来实现我的重新连接行为,但我更愿意通过Wcf添加这种行为。我正在阅读各种各样的Wcf博客,但它无法穿透,我不知道从哪里开始——即使是简单的扩展似乎也需要创建大量的类和大量的配置——这令人费解。通过服务上的显式ICommunicationObject接口向故障事件添加事件处理程序。在事件处理程序中,Abort()删除通道并创建一个新通道。我想,这种技术不能用于NAT后面的客户端