如何让 SignalR 连接尊重会话超时

Posted

技术标签:

【中文标题】如何让 SignalR 连接尊重会话超时【英文标题】:How to get SignalR Connection to Respect Session Timeout 【发布时间】:2016-06-13 15:20:59 【问题描述】:

使用 SignalR,它旨在保持与 Web 服务器的长时间运行连接。但是,我有一个场景,在 ASP.Net 会话过期很久之后,SignalR 连接仍保持与 Web 服务器的开放连接。即使客户端和服务器都没有发送数据,也会发生这种情况。

如何进行设置,以便在 Asp.net 会话到期后,SignalR 连接终止,从而释放服务器上的连接?

这是理想的,因为 Web 服务器在负载均衡器上运行,并且当将服务器从轮换中取出时,我们需要当前连接数来通常表示活动会话的数量 - 而不是仍在踢的 SignalR 连接因为用户打开了浏览器。

【问题讨论】:

我曾想过利用集线器授权机制来确保会话处于活动状态,但这有点笨拙——尤其是因为这根本不需要身份验证。我的另一个想法是让客户端自己通过监视会话状态或通过在会话结束时重定向来终止连接,但同样 - 这感觉更像是一种解决方法,而不是适当的解决方案。 【参考方案1】:

SignalR 服务器不允许断开特定的客户端连接(这将非常有用)。所以客户有责任这样做。

一种解决方法是在客户端上添加一个事件侦听器并从那里断开连接,即:

hubProxy.On<string>("YouAreUselesLetMeAlone", _ => connection.Dispose());

显然,要完成这项工作,您需要一个 asp.net 会话 信号器连接的关系(ConcurrentDictionary?),因此您可以在 asp.net 会话结束时在正确的客户端中调用此方法。

【讨论】:

以上是关于如何让 SignalR 连接尊重会话超时的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core 中使用 SignalR

如何在Linux中增加SSH连接超时的时间

SignalR

如何测试托管在Azure Appservice上的SignalR应用(负载+功能结合)?

SignalR:服务器如何建立与客户端的连接?

SignalR:检测客户端上的连接状态