【问题标题】:SignalR Hub: Calling same method with same parameters on multiple clientsSignalR Hub:在多个客户端上调用具有相同参数的相同方法
【发布时间】:2016-06-16 02:12:47
【问题描述】:

我有一个现有的服务,可以在事件发生时通知大量客户。它使用我自己滚动的长轮询机制。我正在探索用信号器集线器替换该机制,并有一个原型工作。但它的效率非常低,感觉应该有解决方案,但我没有找到它。

我理解 signalr 中的组的概念,组显然是为了防止这种低效率,但我不能使用组是有原因的。我希望我需要在使用每个客户端的 ConnectionId 的许多客户端上调用具有相同参数值的相同客户端方法就足够了。如有必要,我可以解释原因,但这真的离题了。

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

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

更新

我在Allow to Send Json Strings without duplicate Serialization 发现了一个听起来相关的 github 问题(甚至可能是这个确切的问题)。似乎该功能已添加到 signalr,但 github 问题没有说明如何执行此操作,我在 signalr 文档中找不到任何相关内容。

更新 2

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

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

【问题讨论】:

    标签: signalr signalr-hub


    【解决方案1】:

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

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 2018-04-30
      • 2021-12-22
      • 1970-01-01
      • 2011-12-26
      • 2017-03-07
      • 2014-07-29
      • 1970-01-01
      相关资源
      最近更新 更多