【问题标题】:How should I manage SignalR .NET client HubConnection in WebAPI controllers我应该如何在 WebAPI 控制器中管理 SignalR .NET 客户端 HubConnection
【发布时间】:2016-11-11 19:12:13
【问题描述】:

基础设施如下:

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

当在 WebApi 上执行某些控制器操作时,我需要向 SignalR 服务器发送请求并调用一些 Hubs 方法。通常我需要在单个 WebApi 请求中从一个或多个集线器调用多种不同的方法。 我现在要做的是创建新的 HubConnection 并为我需要在单个请求中调用的每个 Hub 方法创建 HubProxy,所以如果我需要调用 5 个不同的集线器方法,我会创建 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 方法中使用它们。 哪种解决方案是正确的,我应该如何实施?连接断开时该如何处理?

【问题讨论】:

  • 您是否尝试过调用 hub 方法而不实际创建连接,如下所述:asp.net/signalr/overview/guide-to-the-api/…
  • @Pawel 是的,我有。当我在同一台服务器上托管 SignalR 和 WebApi 项目时,这种方法很有效,因此它们在同一个 AppPool 上运行。但是现在由于它们都托管在不同的服务器上,我必须创建一个连接。请注意,如果我在 WebApi 上使用 GlobalHost.ConnectionManager.GetHubContext() 仍然有效,但没有客户端会收到任何通知,因为我已从本地 WebApi 上下文加载集线器,因为 SignalR 上下文位于不同的服务器。感谢您的回复。
  • 对不起,我错过了这是在不同的服务器上。我认为最好的办法是在服务器之间保持一个 SignalR 连接,而不是为每个请求打开一个连接——打开 SignalR 连接很重——它需要发送 3 个 http 请求。如果您想将一些数据推送到客户端,您可能总是考虑不在其他服务器上使用 SignalR,而只是将 httpRequest 发送到您将使用 ConnectionManager 的其他服务器。
  • 感谢您的信息。我不知道打开连接需要这么多工作。我还认为更好的解决方案是在服务器之间创建一个连接,但我必须收集有关如何创建健壮实现的更多信息。
  • @blalond 我还得出结论,创建一个新的连接是非常低效和过度的。我认为 SignalR 服务器上带有 WebApi 表面的解决方案 2 非常强大,并且会以出色的性能完成这项工作。但是,我决定采用解决方案 1,在该解决方案中,我直接从我的原始 WebApi 维护一个与 Hub 的客户端连接。我设置连接生命周期处理事件以正确管理连接。 docs.microsoft.com/en-us/aspnet/signalr/overview/…

标签: c# signalr asp.net-web-api2 signalr-hub


【解决方案1】:

我还认为,将类似的反射与可以缓存在字符串中的内容一起使用是让垃圾收集器满意的更好方法。我猜这取决于你的规模。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2020-02-12
    • 2020-04-27
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多