【问题标题】:SignalR DisconectionsSignalR 断开连接
【发布时间】:2012-08-14 18:36:47
【问题描述】:

我在我正在编写的应用程序中使用 Signalr,并将所有用户连接存储在并发字典中

ConcurrentDictionary<string, User> _users = new ConcurrentDictionary<string, User>();

例如 https://github.com/SignalR/SignalR/blob/master/samples/SignalR.Hosting.AspNet.Samples/Hubs/ShapeShare/ShapeShare.cs

我已经在我的集线器上实现了 IDisconnect 接口,当用户断开连接时,我正在从字典中删除用户

我想知道 Disconnect 方法到底有多可靠? 它是否捕获了用户可以断开连接的所有不同方式? 我不希望字典无限地增长和增长

我在考虑也许有一个计时器来定期遍历字典并删除最近没有任何活动的用户

这有必要吗?我可以依赖断开连接方法吗?

【问题讨论】:

    标签: signalr signalr-hub


    【解决方案1】:

    查看https://github.com/SignalR/SignalR/wiki/Configuring-SignalR,有以下设置:

    断开连接超时 活着 & 心跳间隔

    这些都可以用来帮助维护您的字典。

    根据我的经验,正常断开连接似乎在 signalR 上完美运行(win-apps 仍然存在问题),如果它在几分钟内不正常断开连接,则连接将超时并且断开连接方法将触发并将其从您的字典中删除,如 Drew说。

    您可以创建一个向所有客户端发送消息并记录返回的连接 ID 的方法,然后删除所有旧条目,但实际上断开连接方法确实可以工作/自行解决,我只会实现心跳间隔如果您真的需要密切关注连接。

    【讨论】:

      【解决方案2】:

      如果它没有触发它是一个错误,你应该report an issue to the SignalR project on GitHubHere's a list of open issues with Disconnects此时。

      请注意差异。运输有差异。断开检测逻辑等,根据用户使用的传输方式,您将看到差异。 Disconnect 何时触发的模式,但它应该最终为所有传输触发。

      【讨论】:

      • 即使应用程序池已回收,Disconnect 也会触发吗?我的问题是知道何时使我的缓存无效。快应用池不应使缓存失效。但是如果服务器停机时间超过 DisconnectTimeout KeepAlive 间隔,缓存应该不再有效。
      猜你喜欢
      • 2021-12-05
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多