我应该如何在WebAPI控制器中管理SignalR . net客户端HubConnection



基础结构如下:

  • ASP。. NET MVC应用程序在一个服务器上
  • ASP。. NET Web Api 2在第二台服务器上
  • 在第三台服务器上具有多个集线器的SignalR

当在WebApi上执行一些控制器动作时,我需要向SignalR服务器发送请求并调用一些Hubs方法。我经常需要在单个WebApi请求中从一个或多个集线器调用多个不同的方法。我现在所做的是创建新的HubConnection并为我需要在单个请求中调用的每个Hub方法创建HubProxy,因此,如果我需要调用5个不同的Hub方法,我将创建5个不同的连接。我怀疑这是否是管理HubConnection的正确方法。我应该为每个WebApi请求只创建一个HubConnection,还是应该在每个应用程序生命周期中只保留一个HubConnection(所有api请求使用一个实例)?

public class HubsConnectionManager
{
    //private static HubConnection hubConneciton; - Use this for per application singleton
    //private HubConnection hubConnection; - Use this for per request singleton
    public async Task<IHubProxy> GetHub<THub>() where THub : Hub
    {
        var hubConnection = new HubConnection("http://localhost:51489/");
        string hubName = typeof(THub).Name;
        IHubProxy hub = hubConnection.CreateHubProxy(hubName);
        await hubConnection.Start();
        return hub;
    }
}
HubsConnectionManager manager; // HubsConnectionManager is a singleton per request
IHubProxy hub = await manager.GetHub<NotificationHub>();
await hub.Invoke("PushNotificationToUser", notificaiton);

如果我要实现每个请求的单例解决方案,我会在HubsConnectionManager中添加私有HubConnection成员,如果我要实现每个应用程序的解决方案,我会添加私有静态HubConnection并在GetHub方法中使用它们。哪个解决方案是正确的,我应该如何实现它?当连接丢失时,我该如何处理?

我也认为使用反射这样的东西,可以缓存在一个字符串是一个更好的方式来保持垃圾收集器高兴。我想这取决于你的规模。