不活动后出现错误的 WCF 双工回调 - 保持活动长时间运行的推送通知
Posted
技术标签:
【中文标题】不活动后出现错误的 WCF 双工回调 - 保持活动长时间运行的推送通知【英文标题】:Faulted WCF duplex callback after inactivity - keep alive long-running push notifications 【发布时间】:2014-01-21 03:21:37 【问题描述】:总之
如何防止双工回调通道在空闲期后关闭?
详细说明
我有一个主要工作的duplex WCF setup over NetTcpBinding,即the client can talk to the server and the server can call back to the client。
另外,我有a reliable session such that the client does not lose the connection到服务器after the default period of inactivity,用the following configuration on both client and server实现:
var binding = new NetTcpBinding(SecurityMode.None);
// Need to prevent channel being closed after inactivity
// i.e. need to prevent the exception: This channel can no longer be used to send messages as the output session was auto-closed due to a server-initiated shutdown. Either disable auto-close by setting the DispatchRuntime.AutomaticInputSessionShutdown to false, or consider modifying the shutdown protocol with the remote server.
binding.ReceiveTimeout = TimeSpan.MaxValue;
binding.ReliableSession.Enabled = true;
binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue;
但是,在不活动时间少于半小时(尚未准确测量最短时间)之后,服务器无法再次使用回调 - 服务器仅阻塞一分钟左右,并且我没有看到任何异常,而客户端没有任何反应(没有回调的证据)。
线索和根本原因?
请注意,我可以连续两次使用回调罚款,只要我在回调调用之间不等待很长时间。
是否在其他地方配置了回调?回调是否有自己的超时等? 可能是阻塞/线程问题 - need to either set UseSynchronizationContext=false on your client, or avoid blocking while waiting for the message to be received 应该将DispatchRuntime.AutomaticInputSessionShutdown 设置为false,如果是,如何设置?我不太确定它与可靠会话和I do not know where to access this property 有什么关系 还有别的吗?【问题讨论】:
一个简单的方法是使用相同的代理实例从客户端调用一个简单的KeepAlive
方法(例如:每分钟),这样它实际上永远不会空闲。
【参考方案1】:
我通过扩展 BaseClient 类来实现这一点,并在没有其他调用时在目标接口上调用自动保持活动消息。
【讨论】:
谢谢,除非有人建议采取更具预防性的措施,例如将不活动超时设置为关门,尤其是当我需要维护一些客户时.. & WCF 可能会提供自己的 keepalive 消息,但我不确定需要使用哪些值以及自 2009 年以来是否发生了变化?:“根据文档,Reliable Session 将发送 keep-alive 消息在不活动超时的一半之后。不幸的是,预期的行为与实际行为不同。接收超时行为覆盖了保持活动的行为”smartasses.be/2009/01/26/wcf-reliable-session-and-keep-alives 而且“增加超时将保持连接为失败的客户端打开。”? ? ***.com/a/10172147/742084以上是关于不活动后出现错误的 WCF 双工回调 - 保持活动长时间运行的推送通知的主要内容,如果未能解决你的问题,请参考以下文章
WCF 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。