【发布时间】:2016-01-14 11:10:49
【问题描述】:
在将 WCF TCP 绑定用于双工回调作为发布/订阅设计模式的一部分时,我遇到了 WCF 配置难题。
要求客户端使用单向回调从服务器接收通知。不知道何时会收到通知,因此目的是无限期地保持连接打开。如果客户端或服务器收到异常,则启动清理过程以正确关闭、中止和清理 CommunicationObject,然后发出新连接以继续接收通知。
我具有配置客户端和服务器 WCF 端点的显式访问权限。 我的困境是我是否应该:
A.将 sendTimeout 和 receiveTimeout 配置属性设置为 infinite 以尽可能长时间地保持连接打开,同时仍处理异常以重新打开连接。
或者
B.将sendTimeout 和receiveTimeout 保持在较短的时间范围内,例如1 小时。客户端或服务器会接收到超时,进行清理,然后建立新的连接。
使用一个比另一个有优势还是 WCF 不是解决我的问题的可行解决方案?
我的目标是尽可能保持最高可用性。
编辑:
我担心超时的原因是服务器意外关闭或超时连接而客户端没有通过Faulted 和Closing 事件收到任何通知,但我可以确认客户端和服务器都对sendTimeout 和receiveTimeout 使用无限超时。这通常发生在 24 小时的时间范围内。
在 MSDN 文档中搜索 WCF Duplex model 我阅读了以下声明:
双工模型不会自动检测服务或 客户端关闭其频道。因此,如果客户端意外终止,通过 默认不会通知服务,或者如果客户端意外 终止,服务将不会被通知。客户和服务可以 如果他们愿意,实现他们自己的协议以相互通知。
这让我想问是否有人有解决方案来实现他们自己的协议以保持会话处于活动状态,因为这是我遇到的问题?
我是否需要简单的客户端线程定期向服务器发送“心跳”?显然我不想通过心跳向网络发送垃圾邮件,但同时尽可能保持会话处于活动状态。
我相信ReliableSession 不会为这个问题带来真正的好处。
【问题讨论】:
标签: .net wcf wcf-binding publish-subscribe