SignalR Hub:在多个客户端

时间:2016-03-02 23:48:33

标签: signalr signalr-hub

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

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

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

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

更新

我在Allow to Send Json Strings without duplicate Serialization找到了一个与github相关的问题(甚至可能是这个问题)。似乎功能被添加到signalr,但是github问题没有说明如何做到这一点,我在signalr docs中找不到任何关于它的信息。

更新2

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

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

1 个答案:

答案 0 :(得分:0)

将所有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)
}