从服务器调用组中的所有SignalR客户端

时间:2015-03-20 11:28:12

标签: signalr

我需要从服务器后端调用组中的所有SignalR客户端。

我需要相当于Clients.OthersInGroup('MyGroupName').MyFunction但需要通过IHubContext对象(或者来自Hub实例外部)。这有可能吗?

我的使用案例:我是托管SharePoint App的提供商。 SignalR用于实时更新其他客户端的更改(使用SignalR JavaScript客户端)。由于应用程序支持连接到服务器的多租户客户端可以来自不同的SharePoints租户。通信应始终仅在同一租户的客户端之间。因此,如果客户端连接,则将其添加到其SharePoint租户的SignalR组。 现在有一些操作,比如显示一个文件,如果它不存在则创建它,发生在服务器上。在这种情况下,客户端调用后端的URL,然后返回文档。如果是新创建的,则应将其传达给受影响租户的客户。

1 个答案:

答案 0 :(得分:1)

注意:编辑此答案是为了反映有问题的其他信息。

可以通过多种方式解决此问题:

方法1:

向所有属于租户的客户转发通知(我假设您使用租户标识符作为组名)。在通知消息中包括文档作者的标识。然后在处理客户端通知的代码中决定,如果用户是文档的作者。如果他(她)是,请不要显示通知。

这样,您就不必在应用程序的服务器端进行任何特殊过滤,只能使用标准API。

方法2:

您必须在SignaR连接和用户之间创建某种映射。如果您的应用程序在单个服务器上运行,则可以将此信息存储在某个静态映射中。如果您的提供商托管应用程序在服务器场中运行,则必须使用类似Redis的内容。用户和连接之间的映射可以在OnConnected(添加映射的连接ID)和OnDisconnected(从映射中删除连接ID)方法中完成。

然后,当您要发送通知时,使用Group IHubContext.Clients方法,从地图获取属于文档作者的连接列表,并将它们作为应忽略的连接传递。

这样的事情:

string[] connectionIdsBelongingToAuthor = // get from mapping, these will be ignored
string groupName = // get group which should be notified

hubContext.Clients.Group(groupName, connectionIdsBelongingToAuthor).NotificationMethod(...)

我选择方法1并决定是否应在客户端显示通知。