【问题标题】:Connected to multiple hubs and disconnect from only one连接到多个集线器并仅与一个集线器断开连接
【发布时间】:2013-05-24 14:43:07
【问题描述】:

我正在使用 Durandal 编写单页应用程序,并且计划使用 SignalR 来实现某些功能。首先,我有一个顶部栏,用于监听服务器可能发送的通知。该站点开始连接到“TopBarNotificationHub”。

在其中一个页面上,我想连接到另一个中心,因为两个用户可能会同时编辑此页面上的数据,如果有人更新了数据,我想通知。没问题,这工作正常。

但是,当离开该页面时,我只想断开与第二个集线器的连接,但我找不到实现此目的的方法。如果我只是说 hub.connection.stop();与 eTopBarNotificationHub 的连接也会停止(因为它是共享的)。

有没有办法只留下一个 hubproxy 并让另一个 hubproxy 存在?

由于这是一个 SPA,因此“shell”永远不会重新加载,因此它不会再次连接到集线器……我可能会在每次另一个页面与集线器断开连接时强制它重新连接,但可能会有更清洁的解决方案...

提前致谢。

//J

【问题讨论】:

  • 您的服务器语言是什么?它不在您的标签中(使答案中的示例更容易)

标签: signalr


【解决方案1】:

如果您在单个页面上使用多个集线器,这很好,但它们共享相同的连接,因此除了接收更新之外,它不会占用客户端上的更多资源。

因此,要“连接和断开集线器”,您需要稍微重新架构。如果您在服务器端使用组而不是客户端,您可以通过调用(例如)Hub1.Register 方法并将客户端固定在该方法中的相关组中来“注册”到集线器。要“取消注册”,您调用(例如)Hub1.DeRegister 并使用该方法从组中删除客户端的 ConnectionId。然后,当您向客户端推送更新时,您可以只使用 Group 而不是 Clients.All

(C# 假定为服务器语言,因为您没有在标签中指定)

  • 将客户端添加到集线器组:Groups.Add(Context.ConnectionId, groupNameForHub);
  • 从集线器组中删除客户端:Groups.Remove(Context.ConnectionId, id.ToString());
  • 向该 Hub 的客户端广播:Clients.Group(groupNameForHub).clientMethodName(param1, param2);

不过,为了混淆视听,请注意 Hub1 中名为“myGroup”的组与 Hub2 中名为“myGroup”的组是分开的。

这是推荐in the documents 的确切方法(复制到此处以防它们在以后的版本中移动/更改):

多个集线器

您可以在一个应用程序中定义多个 Hub 类。当你这样做时,连接是共享的,但组是分开的:

• 所有客户端将使用相同的 URL 与您的服务建立 SignalR 连接(“/signalr”或您的自定义 URL,如果您指定了一个),并且该连接用于服务定义的所有集线器。

与在单个类中定义所有 Hub 功能相比,多个 Hub 没有性能差异。

• 所有集线器都获得相同的 HTTP 请求信息。

由于所有集线器共享相同的连接,服务器获取的唯一 HTTP 请求信息是建立 SignalR 连接的原始 HTTP 请求中的信息。如果您使用连接请求通过指定查询字符串将信息从客户端传递到服务器,则无法向不同的 Hub 提供不同的查询字符串。所有集线器都将收到相同的信息。

• 生成的 JavaScript 代理文件将在一个文件中包含所有 Hub 的代理。

有关 JavaScript 代理的信息,请参阅SignalR Hubs API Guide - JavaScript Client - The generated proxy and what it does for you

• 组在 Hub 中定义。

在 SignalR 中,您可以定义命名组以广播到已连接客户端的子集。为每个 Hub 单独维护组。例如,名为“Administrators”的组将包含一组用于您的 ContosoChatHub 类的客户端,而相同的组名称将引用一组用于您的 StockTickerHub 类的不同客户端。

【讨论】:

  • 谢谢!我错过了“组”的概念,并且确实将集线器视为一个组,而不是在集线器内部定义的组。感谢您的澄清!
  • 您会推荐单个 HUB 中的多个组还是多个 Hub 中的单个组?
猜你喜欢
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多