SignalR Hub:在多个客户端上调用具有相同参数的相同方法

我有一个现有的服务,在事件发生时通知大量客户端 . 它使用了我自己推出的长轮询机制 . 我正在探索用信号器集线器替换该机制,并使原型工作 . 但它有一个相当显着的低效率,感觉应该有一个解决方案,但我找不到它 .

我理解信号器中组的想法,组显然是为了防止这种低效率,但有一个原因是我不能使用组 . 我希望说我需要在使用每个客户端的ConnectionId的许多客户端上使用相同的参数值调用相同的客户端方法 . 我可以在必要的时候解释原因,但它确实是不合时宜的 .

假设我有一个200个ConnectionId的列表,我需要在它们每个传递相同的对象参数时调用相同的方法 . 如果我简单地遍历ConnectionId调用Clients.Client(ConnectionId).clientMethod(param),我假设param对象将被序列化200次 .

有没有办法将参数序列化一次,然后使用已经序列化的参数调用客户端方法?

UPDATE

我在Allow to Send Json Strings without duplicate Serialization找到了一个与github相关的问题(甚至可能是这个问题) . 似乎功能已添加到signalr,但github问题在信号器文档中没有找到任何关于它的信息 .

更新2

在上面引用的github问题中,新功能仅针对PersistentConnection实现 - 而不是集线器 . 对于持久连接,当发送ArraySegment类型的参数时,signalr假定它是预序列化的并按原样发送它而不对其进行序列化 .

出于某种原因,这没有针对集线器实现,尽管它对集线器有用,原因与持久连接有用的原因相同 .

回答(1)

2 years ago

将所有connectionId存储在 Static List<string> at OnConnected`事件中并使用以下内容,

Static List<string> allconnections = new List<string>();
    public override Task OnConnected()
        {
           allconnections.Add(Context.ConnectionId);
           return base.OnConnected();
         }

Public void YourServerMethod(params)
{
     Clients.Clients(allConnections).clientMethod(params)
}