SignalR Disconections

我在正在编写的应用程序中使用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

我在我的Hub上实现了IDisconnect接口,当他们断开连接时我将从字典中删除用户

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

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

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

回答(2)

2 years ago

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

DisconnectTimeout KeepAlive和Heatbeat间隔

这些都可以用来帮助维护你的字典 .

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

您可以创建一个方法,将消息发送到所有客户端并记录返回的连接ID,然后删除任何旧的条目,但实际上,disconnect方法确实可以正常工作,我只会实现心跳间隔需要密切关注连接 .

2 years ago

如果它没有't fire it'是一个错误,你应该report an issue to the SignalR project on GitHub . Here's a list of open issues with Disconnects此时 .

请注意差异 . 运输有差异 . 断开检测逻辑,因此,根据用户使用的传输,您将看到差异 . Disconnect发射时的模式,但最终应该为所有传输发射 .