我正在实施一个聊天室.到目前为止,这么好 - 用户可以通过JS客户端从他们的浏览器发送消息,我可以使用C#客户端做同样的事情 - 这些消息被广播给其他用户.现在,我正在尝试实施"在线用户".
我的方法如下:
OnConnected
- 将数据库中的用户更新为IsOnline = trueOnDisconnected
- 如果用户没有任何其他连接,请更新数据库中的用户 IsOnline = false
我遇到的问题是OnDisconnected
并不总是为每个客户端ID调用 - 过时的连接阻止"如果用户没有任何其他连接"位解析为true,那么用户总是"在线" ".
我能想到的一个hacky解决方案是始终在db中将用户设置为脱机OnDisconnect
- 但这意味着如果用户打开两个选项卡并关闭一个选项卡,它们将"脱机".然后,我可以将用户重新设置为联机以获取发送的每条消息,但这似乎完全浪费了处理周期,并且仍然留下了一段时间,当用户真正在线时,用户被视为离线.
我相信,如果有办法保证为每个客户端调用OnDisconnected,这个问题就会消失.它看起来就像如果我离开的客户打开很长一段时间(> 10分钟),然后断开,OnDisconnected
不会被调用.我会尽力确定repro步骤并保持更新.
那么 - 这是处理在线状态的有效方法吗?如果是这样,还有什么可以做的,以确保OnDisconnected
最终为每个连接触发?
这个问题让我担心,因为现有的Connections会随着时间的推移而继续增长,如果我没有弄错的话,最终因为未处理的状态连接而溢出.
码:
我正在使用内存中的分组方法.
发送消息(C#):
private readonly static ConnectionMapping<string> _chatConnections =
new ConnectionMapping<string>();
public void SendChatMessage(string key, ChatMessageViewModel message) {
message.HtmlContent = _compiler.Transform(message.HtmlContent);
foreach (var connectionId in _chatConnections.GetConnections(key)) {
Clients.Client(connectionId).addChatMessage(JsonConvert.SerializeObject(message).SanitizeData());
}
}
Run Code Online (Sandbox Code Playgroud)
国家管理:
public override Task …
Run Code Online (Sandbox Code Playgroud) 在我的集线器中,如何获取所有当前连接的connectionId的列表?
从本质上讲,我正在进行一些加密(是的,我已经与一群人交谈,没有任何内置工作)并且Aes
每个连接都有一个实例.所以基本上当我需要向所有客户端发送消息时,我不能只做Clients.All
,而是必须手动枚举所有客户端,获取其Aes编码器(通过id),然后向其发送消息.
相关问题在于:获取连接到SignalR集线器的侦听器,客户端的数量
2年过去了,vNext与SignalR 3一起推出,我想知道是否有任何默认方式将连接的客户端计入特定连接或者是否计划稍后将此功能引入SignalR 3?