0

我有一个托管在 Windows 服务中的 WCF 服务,该服务将错误发布到任何订阅的监视器应用程序。有 2 个服务器应用程序向服务发布错误,然后将这些错误发送到任何订阅的监控应用程序。这是使用 WSDualHttpBinding 完成的。

这可行,但在一段时间不活动后,它会停止工作并显示一个错误,指出可靠会话出现故障。我已经阅读了几篇关于这个问题的文章,但它并没有帮助找到它。我已经进行了所有必要的异常处理,但这没有帮助。

该系统不是发布我的代码,而是基于 MSDN 中的基于列表的发布订阅示例,只是添加了错误检查和异常处理。下方链接。

http://msdn.microsoft.com/en-us/library/ms752254.aspx

有谁知道是什么原因造成的?

4

2 回答 2

1

你是对的,你需要增加你的不活动超时。但是当您使用可靠会话时,receiveTimeout 也会被考虑在内。从这篇MSDN 文章

使用可靠会话时,必须满足两个不同的不活动计时器才能使连接保持活动状态。如果这些不活动计时器中的任何一个关闭,则连接将被丢弃。

第一个不活动计时器在可靠会话上,称为 InactivityTimeout。如果在超时期限内没有收到任何消息,无论是应用程序还是基础设施,都会触发此不活动计时器。基础结构消息是为通道堆栈中的协议之一(例如保持活动或确认)而生成的消息,而不是包含应用程序数据。

第二个不活动计时器在服务上,并使用绑定的 ReceiveTimeout 设置。如果在超时期限内没有收到应用程序消息,则此不活动计时器会触发。例如,这指定了客户端在服务器关闭会话使用的通道之前向服务器发送至少一条消息所花费的最长时间。此行为可确保客户端无法在任意长时间内保留服务器资源。

由于如果任一非活动计时器触发,连接就会断开,因此一旦 InactivityTimeout 大于 ReceiveTimeout 就增加它没有任何效果。这两个超时的默认值都是 10 分钟,因此在使用可靠会话时,您始终必须同时增加这两个超时。

将这两个值都设置为“无限”(如果您使用配置文件)或者TimeSpan.MaxValue如果您在代码中设置绑定应该可以实现您想要的。

编辑 1 将 receiveTimeout 和 inactivityTimeout 值设置为“infinite”将在编译器中生成警告。这没关系。IDE 使用不考虑该关键字的 XSL。在幕后,WCF 使用 TimeSpanOrInfiniteConverter 将关键字转换为 TimeSpan.MaxValue。 资源

于 2011-08-25T12:58:22.110 回答
0

我似乎已经解决了这个问题,但我所做的只是将绑定从 WSDualHTTPBinding 更改为 NetTcpBindng。它现在已经运行了 48 小时,而之前它不会运行超过一个小时。

于 2011-08-31T08:05:00.067 回答