Signalr 连接到多个集线器并仅从一个集线器断开连接

Signalr 连接到多个集线器并仅从一个集线器断开连接,signalr,Signalr,我正在用Durandal编写一个单页应用程序,并计划使用SignalR实现一些功能。首先,我有一个顶部栏,用于侦听服务器可能发送的通知。站点启动到“TopBarNotificationHub”的连接 在其中一个页面上,我想连接到另一个中心,因为两个用户可能同时编辑此页面上的数据,我想通知是否有人更新了数据。没问题,这个很好用 但是,当离开该页面时,我只想断开与第二个集线器的连接,但我找不到实现这一点的方法。如果我只说hub.connection.stop();与eTopBarNotificati

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

在其中一个页面上,我想连接到另一个中心,因为两个用户可能同时编辑此页面上的数据,我想通知是否有人更新了数据。没问题,这个很好用

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

有没有办法只留下一个代理而让另一个存在

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

提前谢谢


//J

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

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

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

  • 要将客户端添加到中心组:
    Groups.add(Context.ConnectionId,groupNameForHub)
  • 要从集线器组中删除客户端:
    Groups.remove(Context.ConnectionId,id.ToString())
  • 要向该中心的客户端广播:
    clients.Group(groupNameForHub.clientMethodName(param1,param2)
不过,为了让人混淆,请注意,Hub1中名为“myGroup”的组与Hub2中名为“myGroup”的组是分开的

这正是推荐的方法(复制于此处,以防在更高版本中移动/更改):

多中心

您可以在一个应用程序中定义多个中心类。执行此操作时,连接是共享的,但组是分开的:

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

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

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

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

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

有关JavaScript代理的信息,请参阅

•集线器中定义了组

在SignalR中,您可以定义要广播到已连接客户端子集的命名组。为每个中心分别维护组。例如,一个名为“Administrators”的组将为您的ContosChatHub类包含一组客户端,而相同的组名将为您的StockTickerHub类引用另一组客户端


你的服务器语言是什么?它不在您的标签中(使答案中的示例更容易),谢谢!我忽略了“组”的概念,并将中心视为一个组,而不是在中心内部定义的组。谢谢你的澄清!您是建议在一个集线器中使用多个集线器组,还是建议每个集线器使用一个组?