在 API 控制器中访问 SignalR Hub 上下文的有效方法

Efficient way to access SignalR Hub Context in API controllers

我的几个 API 控制器需要访问 Hub 上下文,我知道 GlobalHost.ConnectionManager.GetHubContext 调用很昂贵。有没有有效的方法来做到这一点?

你怎么知道 GlobalHost.ConnectionManager.GetHubContext 通话很贵?

我只是尝试在一个循环中调用 GetHubContext 10,000 次,这在我的机器上花费了 174 毫秒。这意味着每次通话平均耗时 0.0000174 秒。我不认为这在大多数 Web API 调用或一般 Web 请求的上下文中特别昂贵。

如果在建立任何 SignalR 连接之前第一次调用 GetHubContext,那么初始调用将花费更长的时间。在我的机器上,第一次调用耗时 96 毫秒。这段时间用于初始化一些 SignalR 单例,这些单例通常会在建立第一个 SignalR 连接时进行初始化。随后的调用平均为上面提到的 .0174 毫秒。

如果这太昂贵,您总是可以将返回的 IHubContext 存储在单例中。它是线程安全的。