SignalR连接(集线器代理)生存期



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

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

与。相比,多个hub没有性能差异在一个类中定义所有Hub功能。

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

在同一文档的后面…

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

…不确定最后一点是否与您所要求的相关,但在您计划信号架构时了解它是很好的。

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

(更新)

看了@ alexdresko的回答后,我意识到我的回答需要一些澄清。在同一个连接下创建多少代理并不重要,它不会改变性能:
hubConnection = new HubConnection(BASE_ADDRESS);
var chatProxy = hubConnection.CreateHubProxy("chatHub");
var otherProxy = hubConnection.CreateHubProxy("otherHub");  
var nProxy = hubConnection.CreateHubProxy("nHub");      

然而,你问的是

将连接(hub proxy)保持在某处是否更好

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

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

最新更新