![]() |
1
4
为了防止服务器端关闭连接,可以在契约中设置heartbeat()方法,客户机可以定期调用该方法。然而,这并不理想,因为一方面,底层套接字可能会丢失,而这并不能弥补这一点。 就您的建议1)如果在客户端,您继承的是ClientBase,那么您会有点陷入这样的困境,除非您调用一个方法来路由到服务,否则不会给出任何问题的迹象。您必须将调用包装在一个try/catch中,然后使用一些重新连接逻辑:
您对建议2)的意见是正确的,如果服务器端和客户端之间有防火墙,它们很可能不允许连接。 编辑: 为了扩展我对1的建议,当对服务的调用因CommunicationException失败时,您需要创建一个新的连接。最简单的方法是在构造函数中创建服务通道,然后在调用失败时创建另一个通道:
编辑2: 在WCF中,会话由客户机处理,如果客户机和服务之间的会话丢失,我不知道从客户机或服务恢复该会话的方法。不幸的是,你被困在这里。 如果服务想要通过一个中断会话的回调发送,简单地说,它不能。因为网络的工作方式,服务可能不知道实际的客户机地址。这和其他各种问题(如防火墙)意味着尝试从服务重新建立与客户机的连接是不现实的。服务的唯一方法是存储它要发送给客户机的数据,并在服务检测到客户机已重新连接时发送。 在客户机尝试通过套接字发送某些内容之前,不能保证客户机知道底层套接字将丢失,因此会出现try…catch。从客户机重新创建通道,一旦它发现断开的连接,这是我所知道的处理问题的唯一方法;这就是代码示例所做的。 心跳是一种主动处理断开连接的方法。它的效率取决于您对检测断开连接的速度以及存在多少客户机的要求。连接的客户机越多,心跳就越长,这样您就不会在服务的网络上增加负载。 EdTe3: 在进行了一些额外的挖掘之后,可能会有一种方法可以自动完成您想要的工作。您可以创建一个 Reliable Session . 激活此项涉及在配置中创建其他条目:
它还可用于与HTTP相关的绑定,请查看指向该功能的Microsoft文档的链接。 |