我在Windows服务中托管了一个WCF服务,该服务向任何订阅的监视器应用程序发布错误。有2个服务器应用程序向服务发布错误,然后将这些错误发送到任何订阅的监视器应用程序。这是使用WSDualHttpBinding完成的。
这可以工作但是在一段时间不活动之后它会停止工作并引发一个错误,指出可靠的会话出现故障。我已经阅读了几篇关于这个问题的文章,但它没有帮助追踪它。我已经完成了所有必要的异常处理,但这没有帮助。
系统不是发布我的代码,而是基于MSDN中的基于列表的发布订阅示例,只是添加了错误检查和异常处理。链接如下。
http://msdn.microsoft.com/en-us/library/ms752254.aspx
有没有人有任何想法导致这个?
答案 0 :(得分:1)
你是对的,你需要增加你的不活动超时。但是当您使用可靠会话时,也会考虑receiveTimeout。从MSDN Article:
开始使用可靠会话时,有两种不同的不活动 定时器必须满足以保持连接活着。如果是 这些不活动定时器熄灭,然后断开连接。
第一个不活动计时器在可靠会话上并被调用 InactivityTimeout。如果没有消息,则会触发此非活动计时器, 应用程序或基础架构,在超时内收到 期。基础结构消息是为其生成的消息 通道堆栈中的一个协议的目的,例如a 保持活力或确认,而不是包含应用程序 数据
第二个不活动计时器在服务上并使用 绑定的ReceiveTimeout设置。这个不活动计时器会触发 在超时期限内未收到任何应用程序消息。这个 例如,指定客户端发送的最长时间 服务器关闭之前至少有一条消息到服务器 会话使用的频道。此行为可确保客户端不能 持续长时间使用服务器资源。
如果任何不活动计时器触发,连接都会被丢弃, 一旦它大于ReceiveTimeout,就会增加InactivityTimeout 没有效果。这两个超时的默认值为10分钟, 所以你总是必须增加它们两者才能有所作为 使用可靠的会话。
将这两个值设置为“无限”(如果您正在使用配置文件)或TimeSpan.MaxValue
如果您在代码中设置绑定应该可以实现您所需要的。
编辑1 将receiveTimeout和inactivityTimeout值设置为“infinite”将在编译器中生成警告。这没关系。 IDE使用不考虑该关键字的XSL。在幕后,WCF使用TimeSpanOrInfiniteConverter将关键字转换为TimeSpan.MaxValue。 Source
答案 1 :(得分:0)
我似乎修复了这个问题,但我所做的就是将绑定从WSDualHTTPBinding更改为NetTcpBindng。它现在已经运行了48个小时,而在它运行不会超过一个小时之前。