【问题标题】:SignalR connection (hub proxy) lifetimeSignalR 连接(集线器代理)生命周期
【发布时间】:2024-01-22 18:40:01
【问题描述】:

将客户端连接到 SignalR 集线器的最佳做法是什么?在客户端,是在某处保持连接(集线器代理)更好,还是为每个集线器方法调用创建连接(集线器代理)更好?

【问题讨论】:

    标签: connection signalr signalr-hub signalr.client


    【解决方案1】:

    https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#multiplehubs

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

    您是否使用多个集线器只是决定您希望如何在逻辑上组织代码的问题。标准 OOP 实践适用于此。

    稍后在同一文档中...

    如果您需要在长寿命对象中多次使用上下文, 获取一次参考并保存它,而不是每次都再次获取它 时间。获取上下文一次可确保 SignalR 将消息发送到 客户端的顺序与您的 Hub 方法生成客户端的顺序相同 方法调用。有关显示如何使用 SignalR 的教程 集线器的上下文,请参阅使用 ASP.NET SignalR 进行服务器广播。

    ...不确定最后一点是否与您的要求相关,但在您规划信号器架构时了解一下是件好事。

    【讨论】:

      【解决方案2】:

      最佳方法是为所有方法调用只保留一个连接。您打开的每个新连接都会浪费网络资源和处理,因为 SignalR 需要为每个连接与服务器保持实时连接。这意味着移动设备的电池消耗和更多的服务器工作负载。

      [更新]

      阅读@alex-dresko 的答案后,我意识到我的答案需要澄清一下。 无论您在同一连接下创建多少代理,都不会改变性能:

      hubConnection = new HubConnection(BASE_ADDRESS);
      
      var chatProxy = hubConnection.CreateHubProxy("chatHub");
      var otherProxy = hubConnection.CreateHubProxy("otherHub");  
      var nProxy = hubConnection.CreateHubProxy("nHub");      
      

      但是,你问的是

      在某处保持连接(集线器代理)会更好

      嗯,连接是一回事(HubConnection),代理是另一回事。 新连接将在客户端和服务器之间打开新的桥梁,因此在您的应用程序中全局创建和持久化单个连接是有意义的。然后,您可以重复使用相同的连接来创建任意数量的代理。

      您可以轻松地测试这个场景。创建一个创建连接和 2 个代理集线器的控制台应用程序。然后在每个连接上创建 2 个连接和 1 个集线器并检查信号器日志...

      【讨论】:

      • 这是我需要的答案。即使它不是移动/网络应用程序,而是桌面应用程序,我也是这样做的。