通过WCF和TCP保持活力

本文关键字:TCP WCF 通过 | 更新日期: 2023-09-27 18:28:56

我有一个Windows服务托管一个高级WCF服务,该服务通过TCP(netTCP)与protobuf.net通信,有时还与证书通信。

receiveTimeout设置为无限,以避免因不活动而断开连接。但据我所知,无论如何都可能会断开连接,所以我创建了一个简单的双向保持连接服务方法,客户端每9分钟调用一次以保持连接。这种联系永远不会中断,这一点非常重要。

这是正确的方法吗?或者我可以因为receiveTimout设置为无穷大而简单地删除我的keep-live吗?

编辑:WCF服务的当前app.config:http://1drv.ms/1uEVKIt

通过WCF和TCP保持活力

否。这被广泛误解,不幸的是,有很多错误信息。

首先,"无限"是一种半有效值。有两个特殊的配置序列化程序可以将"Infinite"转换为TimeSpan.MaxValueint.MaxValue(所以它们无论如何都不是真正的"无限"),但WCF中似乎并不是所有东西都能识别这一点。因此,最好使用时间值明确指定超时。

其次,您的服务中不需要"keepalive"方法,因为WCF提供了所谓的"可靠会话"。如果添加<reliableSession enabled="true" />,WCF将通过"基础结构消息"提供自己的保持活动机制。

通过拥有自己的"保活"机制,您可以有效地将服务的负载增加一倍,而且实际上您可以制造比解决更多的问题。

第三,使用可靠会话时,使用reliableSessioninactivityTimeout设置。这做了两件事。首先,它控制基础结构(keepalive)消息的发送频率。它们以超时值的一半发送,所以如果您将其设置为18分钟,那么它们将每9分钟发送一次。其次,如果在非活动超时内没有收到任何基础设施或操作消息(即数据合约中的消息),则连接将中止,因为可能存在问题(一侧崩溃、网络问题等)

receiveTimeout是在中止连接之前无法接收到任何操作消息的最长时间(默认为10分钟)。将其设置为较大的值(Int32.MaxValue大约在24天内)可保持连接,将inactivityTimeout设置为较小的值(同样,默认值为10分钟)(小于网络路由器从非活动状态断开连接前最长时间的2倍)可保持连接有效。

WCF为您处理所有这些。然后,您可以简单地订阅"连接中止"消息,以了解何时由于真实原因(应用程序崩溃、网络超时、客户端断电等)而断开连接,并允许您重新创建连接。

此外,如果您不需要有序消息,请设置ordered="false",因为这大大降低了可靠会话的开销。默认值为true。

注意:在inactivityTimeout过期(或您尝试使用连接)之前,您可能不会收到连接中止事件。请注意这一点,并相应地设置您的超时。

互联网上的大多数建议都是将receiveTimeout和inactivityTimeout设置为Infinite。这有两个问题,第一,基础设施消息没有及时发送,所以路由器会断开连接。。。强迫你做自己的纪念品。其次,大量的非活动超时意味着它无法识别连接何时合法断开,你必须依靠ping中止来知道何时发生故障。这完全没有必要,事实上甚至会使您的服务更加不可靠。

另请参阅:如何正确配置WCF NetTcp双工可靠会话?