【问题标题】:SignalR: Get clients list for PersistentConnectionSignalR:获取 PersistentConnection 的客户端列表
【发布时间】:2011-11-20 10:51:44
【问题描述】:

我搜索了 google、SignalR wiki 和 SignalR 代码本身(例如,广播功能、Signaler 等),但一无所获。

我编写了 ClientIDFactory 并成功地将 ClientID 设置为 UserID。 它可以工作,但现在用户无法从多个浏览器/选项卡进行连接。

我修改了函数并将随机字符串添加到 UserID。它有效。

现在我需要找到一种方法来获取用户的所有连接,将特定的消息发送到特定的 UserID。

我考虑循环客户端列表,通过string.split()找到UserID,但其他方式可能有用。

我没有使用集线器。只有 PersistentConnection。

谢谢,

【问题讨论】:

  • 为什么需要客户列表?当建立新连接时,您不能在您的集线器中跟踪该列表。
  • 我没有使用集线器。我无法使用 OnConnectedAsync/OnConnected 并跟踪自己,因为在 IIS AppPool Recycle(例如 - 代码更改)上,用户“连接”了旧会话中的 cookie,而不是触发此事件。 (谢谢大家)
  • 无论哪种方式,您都需要自己跟踪。客户端可以在另一台机器上,但仍会收到通知。它实际上是底层消息存储和信号总线的实现细节。

标签: vb.net signalr


【解决方案1】:

我认为您的方法不正确,因此这已经浮出水面。您在服务器端有连接和断开连接方法可以连接。在连接时,您需要保持与一些元数据的连接,然后即使服务器重新启动,您也可以检查元数据以获取唯一用户或唯一客户端并使用新 ID 重新连接它们。

例如

  1. 如果您从移动设备购买商品并且您没有登录(没有与用户相关的元数据)并且您在购物篮中放置了 2 件商品。当您使用桌面时,您不会在篮子中看到这两项,因为服务器无法将您与来自同一台机器的同一用户联系起来。
  2. 如果您已登录(元数据,如电子邮件或附加到当前连接 ID 的用户名)并且您从移动设备浏览并在购物篮中添加 2 项。当您登录到您的桌面时(新的连接 ID 可以与相同的元数据电子邮件或用户 ID 链接),然后您可以告诉它是同一用户。如果您随后需要向该用户发送消息,则必须将其发送到两个客户端 ID,您可以通过将它们分组或将其发送到两个 ID 来实现。

如果客户端丢失了连接 ID,它应该断开连接,并且在新连接上它将有新的连接 ID,因此您应该考虑映射它们。 如果我连接来自 7 个不同手机的 7 个 ID,只要您的系统知道它们都是此通知的预期接收者,通知就会发送给所有 7 个。持久化这些知识的实现不是 signalR 的一部分,因此您必须自己实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2021-06-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多