多集线器一连,防止神级

Lee*_*ong 5 c# asp.net asp.net-core asp.net-core-signalr

这里开始,它指出

所有客户端都将使用相同的 URL 与您的服务建立 SignalR 连接(“/signalr”或您的自定义 URL,如果您指定了一个),并且该连接用于服务定义的所有集线器。

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

我想这样做的原因只是因为我唯一的集线器正在成为神级,但是,我找不到在 .NET Core 中做多个集线器的方法(同时共享一个连接)。我希望我能这样做,然后我就可以像在 Web API 中那样管理我的代码。

一种可能的解决方案可能会创建多个连接,但我必须在我的客户端管理不同的连接,只是为了防止服务器代码上的上帝类。

这里开始,有人指出将方法映射到外部类是一种解决方法。这是唯一的解决方法吗?

Mat*_*ijs 5

由于 SignalR 已集成到 ASP.NET Core 中,因此不再可能多个集线器使用一个连接:

在 ASP.NET Core SignalR 中,连接模型已得到简化。连接直接与单个集线器建立,而不是使用单个连接来共享对多个集线器的访问。


作为上帝类的解决方法,#region如果您想使用单个集线器,则可以使用's 来构造代码。

但是,我确实建议针对每种目的使用不同的集线器。例如:如果我有一个聊天系统,我会使用特定的中心 ( ChatHub) 进行聊天。如果我也有一个测验系统,我会使用QuizHub,等等......

我真的没有看到处理多个连接的问题。因为不会出现性能问题。通过为每个目的分离代码,您可以实现关注点分离(如果我错了,请纠正我)。

如果可以,请仅在实际使用客户端代码(连接)的页面上初始化客户端代码(连接),方法是将 SignalR 客户端代码(每个集线器)划分到其自己的文件中。

让我们看最后一个例子:如果测验有自己的页面,则仅加载该页面上的 SignalR 客户端代码。


您可以尝试的另一件事是 AJAX 请求。有时,我将代码分离到不同的 API 控制器中,然后简单地向 API 控制器发出 AJAX 请求,以处理数据库事务等。

您还可以通过使用该控制器内的一些IHubContext<T>SignalR 功能。

在 ASP.NET Core SignalR 中,您可以通过依赖项注入访问 IHubContext 的实例。您可以将 IHubContext 实例注入控制器、中间件或其他 DI 服务。使用该实例向客户端发送消息。

class SomeController : Controller
{
    private readonly IHubContext<MyHub> _hubContext;

    public SomeController(IHubContext<MyHub> hubContext)
    {
        _hubContext = hubContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

在集线器之外使用 SignalR 函数的文档有更多示例。

缺点是您无法使用 SignalR 的所有优秀功能,例如向组添加连接。可以在您的控制器内使用。

  • “因为不会有性能问题。”不完全同意。每个集线器都会打开自己的连接,因此 100 个用户将生成 200 个连接,而不是仅 100 个。如果使用某种会话,则必须提取 200 次,而不是仅 100 次。当多个连接保持打开状态时,它还可能会影响移动设备的电池。我同意关注点分离。但我认为旧的方法在这里更好:集线器之间有一个干净的分离,而不必担心太多的连接。 (5认同)
  • 根据[这篇文章](/sf/answers/3799959621/),Apple系统似乎限制每台服务器有四个连接。这可以通过 SignalR Core 上的多个集线器轻松实现,但对于单个连接的旧方法来说没有问题。 (3认同)