Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF可靠会话出现故障_C#_.net_Wcf_Wsdualhttpbinding - Fatal编程技术网

C# WCF可靠会话出现故障

C# WCF可靠会话出现故障,c#,.net,wcf,wsdualhttpbinding,C#,.net,Wcf,Wsdualhttpbinding,我有一个托管在Windows服务中的WCF服务,该服务将错误发布到任何订阅的监视器应用程序。有两个服务器应用程序将错误发布到服务,然后将这些错误发送到任何订阅的监控器应用程序。这是使用WSDualHttpBinding完成的 这可以工作,但在一段时间的不活动后,它会停止工作,并出现一个错误,指出可靠会话出现故障。我读过几篇关于这个问题的文章,但都没有帮助我找到答案。我已经加入了所有必要的异常处理,但这没有帮助 系统不是发布我的代码,而是基于MSDN中基于列表的发布-订阅示例,只是添加了错误检查和

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

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

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


有人知道这是什么原因吗?

你说得对,你需要增加不活动超时时间。但是,在使用可靠会话时,也会考虑receiveTimeout。由此:

使用可靠会话时,有两种不同的非活动状态 必须满足的计时器,以保持连接处于活动状态。如果有的话 其中一个非活动计时器关闭,然后连接断开

第一个非活动计时器位于可靠会话上,并被调用 不活动的时间结束了。如果没有消息,此非活动计时器将触发, 在超时时间内接收到应用程序或基础结构 时期基础结构消息是为以下内容生成的消息: 通道堆栈中协议之一的用途,例如 保持活动状态或确认,而不是包含应用程序 数据

第二个非活动计时器位于服务上,并使用 绑定的ReceiveTimeout设置。如果发生以下情况,此非活动计时器将触发: 在超时期间未收到任何应用程序消息。这 例如,指定客户端在发送时可能花费的最长时间 在服务器关闭前,至少向服务器发送一条消息 会话使用的通道。此行为确保客户端不能 任意长时间保留服务器资源

由于连接会在任一非活动计时器触发时断开, 大于ReceiveTimeout时增加InactivityTimeout 没有效果。这两个超时的默认值均为10分钟, 所以你总是要增加这两个数值,以便在 使用可靠的会话

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

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

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

InnerException中是否没有关于可能导致问题的原因的信息?这似乎是由InactiveTimeout设置引起的?我的连接是persession,为什么还要有一个非活动超时?在理想情况下,我们的服务器不会导致错误,因此错误服务不会向监控应用程序报告任何内容。我仍然希望连接打开,以防万一。是否可以完全禁用不活动超时?如果没有,是否有一种方法可以检测到连接已关闭,以便可以重新打开?因此,正如本文所述,这似乎是一个错误。解决方案是在给定的时间间隔内“ping”监视器应用程序。对我来说似乎真的很傻,但这就是问题所在。当然,可靠会话的一部分目的是确保连接在需要的时间内保持活动状态?当我更新app.config以使该值为“无限”时,我会收到警告,表明该值无效。那么如何将其设置为无穷大呢?我已将两个超时设置为24.20:31:23.6470000(您似乎可以将其设置为的最大值)。在大约10分钟的不活动后,它仍然超时。编辑了我关于Infinite关键字的答案。您能在原始问题中发布您的绑定配置吗?