首先:我们已经为我将要描述的问题找到了一个有效的解决方案,但感觉不太对劲。
我们的应用程序包含一台应用程序服务器和大约 30 - 100 个客户端。扩展服务器不是问题。最重要的是从服务器到客户端的通知,当然也有从客户端到服务器调用的服务方法。
我们现在要做的是创建一个带有回调 channel 的服务合约,在服务中注册客户端(即该服务包含事件回调 channel 列表)并通过这些回调 channel 发送通知。
我们需要解决的问题是:
- 连接超时 - 服务现在包含一些客户端大约每分钟 ping 一次的 KeepAlive 方法
- 服务器或网络故障后重新连接客户端 - 这是我关心的要点。目前,我们有一个长期运行的客户端对象(服务引用,继承自 DuplexClientBase)来调用服务和回调对象来处理收到的通知。在
client.Faulted
上,我们尝试用新创建的客户端替换客户端和回调对象,直到可以再次访问服务器。这种方法涉及一些奇怪的异常处理......
问题:在每个客户端上启动 WCF 服务并在服务器上注册每个客户端的端点是否会更好?对于上述两个问题有没有更好的解决方案?
编辑:重点是:我错过了什么吗? - 我相信所描述的架构应该很常见,我正在寻找“默认”、最好的方法。没有一些此类设置的示例吗?
最佳答案
如果您的问题与可用性有关(在本例中是服务 -> 消费者和消费者 -> 服务的可用性),那么也许您应该考虑使用一些容错性更强的传输,例如 MSMQ(可能使用 netMsmqBinding)。
您可以使用简单、持久的订阅存储来替换复杂的 WCF 回调基础结构。
当您需要发送“回调”时,只需从订阅存储中检索消费者列表并向每个消费者发送一条消息即可。
连接永远不会超时,因为您没有状态连接。
网络故障后从消费者到服务的重新连接也得到了解决 - 事实上,小的网络中断甚至不会被注意到。
抱歉,这并不能直接回答您原来的问题,并且感谢这种规模的返工可能不在您的要求范围内。
关于带通知的客户端/服务器 WCF 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017812/