3

I'm writing a Single Page Application with Durandal and I'm planning on using SignalR for some functionality. First of all, I have a top bar that listens for notifications that the server may send. The site start a connection to the "TopBarNotificationHub".

On one of the pages I want to connection to another hub as two users might edit the data on this page simultaneous and I want to notify if someone updated the data. No problem, this works fine.

But, when leaving that page I want to disconnect from ONLY the second hub, but I can't find a way to accomplish this. If I just say hub.connection.stop(); the connection to th eTopBarNotificationHub also stops (as it's shared).

Is there a way to just leave one hubproxy and let the other exist?

As this is a SPA the "shell" is never reloaded so it doesn't connect to the hub again... I might be able to force this to reconnect everytime another page disconnects from a hub, but there might be a cleaner solution...

Thanks in advance.

//J

4

1 回答 1

7

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

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

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

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

不过,为了让人感到困惑,请注意 Hub1 中名为“myGroup”的组与 Hub2 中名为“myGroup”的组是分开的。

这是文档中推荐的确切方法(在此处复制以防它们在更高版本中移动/更改):

多个集线器

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

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

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

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

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

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

有关 JavaScript 代理的信息,请参阅SignalR Hubs API 指南 - JavaScript 客户端 - 生成的代理及其对您的作用

• 组在集线器内定义。

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

于 2013-05-24T14:54:11.550 回答