由于 SignalR 已集成到 ASP.NET Core 中,因此 any more 无法为多个集线器使用一个连接:
在 ASP.NET Core SignalR 中,连接模型已被简化。直接连接到单个集线器,而不是使用单个连接来共享对多个集线器的访问。
作为 god 类的一种解决方法,如果您想使用单个集线器,您可以使用 #region 来构建您的代码。
但是,我确实建议为每个目的使用不同的集线器。例如:如果我有一个聊天系统,我会使用一个特定的中心 (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;
}
}
using SignalR functions outside the hub的文档,有更多例子。
缺点是您无法使用 SignalR 的所有出色功能,例如向组添加连接。可以在您的控制器中使用。