SignalR持久保存匿名用户的连接

时间:2018-03-31 17:13:31

标签: c# signalr session-cookies asp.net-core-2.0 asp.net-core-signalr

我有一个可供匿名用户使用的SignalR Chat。我需要一种方法来映射用户,以便在页面重新加载时保持连接,如果用户有多个选项卡,他们应该在每个选项卡上显示消息。

如果我使用Context.ConnectionId,则每个页面重新加载都会创建一个新连接。我想使用单用户组来映射这些连接。

对于已登录的用户,我使用Context.User.Identity.Name

Groups.AddAsync(Context.ConnectionId, Context.User.Identity.Name);

是否有类似方法可以获得匿名用户"身份" ?从我所读到的,会话不应该在SignalR集线器中使用,但我发现的所有信息都是旧的,所以我可能在这里错了。

2 个答案:

答案 0 :(得分:1)

重新加载页面时,将关闭现有连接,并打开一个新连接。新连接将具有新的连接ID,并且在服务器端,您将无法告知用户启动了它。根据您的情况,您可以尝试通过其IP地址识别用户 - 即,当连接打开时您将存储用户ip,然后,当打开新连接时,您将检查您是否已经看过ip。然而,这可能不起作用,因为同一用户实际上可以具有不同的ips并且多个用户可以具有相同的ip。另一种方法是在打开连接时在查询字符串中发送客户端生成的标识符,并使用它来标识服务器端的同一用户。

答案 1 :(得分:0)

您必须实现某种机制来为每个用户创建唯一ID。

我会做类似以下的事情

  • 在用户实际连接到Hub之前,我会创建一个唯一的ID和 将其存储在cookie中

  • 使用此cookie的值设置signalR URL的查询字符串 每次呼叫集线器都可以使用用户的ID

  • 现在即使用户刷新页面,旧连接也会 通过signalR自动从组中删除,你可以 继续添加映射到唯一生成的新连接 ID。