【问题标题】:SignalR persist connections for anonymous usersSignalR 为匿名用户保持连接
【发布时间】:2018-09-10 10:29:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果您不想让他们表明自己的身份,没关系。但是您可以为它们指定一个名称并将其保存为 cookie 或会话变量。你也可以让他们编辑。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我会做类似以下的事情

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

    • 使用此 cookie 的值设置 signalR URL 的查询字符串,以便 每次调用中心都将使用用户的 ID

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2020-03-30
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多