使用 IHubContext 实例化 SignalR Hub 对象

Cas*_*aly 7 c# asp.net sqldependency signalr signalr-hub

SignalR 集线器的一大用途似乎是向所有其他客户端显示一个客户端的操作。我希望使用 SignalR 的目的是,当我的服务器端代码中发生某个事件时,我想实例化一个集线器对象并调用其方法之一来与所有客户端进行通信。如果您看到我之前的文章(Route To Take With SqlDependency OnChange),我想在 SqlDependency 的 OnChange 方法中执行此操作。经过研究,我发现有些人谈论使用 IHubContext 对象,尽管我还没有找到很多实例化和实际向客户端发送数据的示例。

这是否可以做到(如果可能的话,使用 IHubContext 向所有客户端发送数据可能会是什么样子),如果不可能,有什么方法可以绕过实例化这样的集线器?

Ale*_*ese 6

适用于 ASP.NET Core 的 SignalR

您可以创建一个已注入的类IHubContext<T>。如果需要,可以注入其他依赖项,或者从控制器或其他类解析服务。

public class NotificationService
{
    private readonly IHubContext<MyHub> _myHubContext;

    public NotificationService(IHubContext<MyHub> myHubContext)
    {
        _myHubContext= myHubContext;
    }

    public async Task SendMessage(string message)
    {
        await _myHubContext.Clients.All.SendAsync("Update", message);
    }      
}
Run Code Online (Sandbox Code Playgroud)

假设您使用SqlDependency的是IHostedService

public class MyHostedService : IHostedService
{
     public MyHostedService(
          NotificationService notificationService)
     {
          // TODO get reference to sqlDependency
          sqlDependency.OnChange += (s, e) => _notificationService.SendMessage(e.Info.ToString());
     }         
}
Run Code Online (Sandbox Code Playgroud)

用于 ASP.NET 的 SignalR

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.sendMessage(message);
Run Code Online (Sandbox Code Playgroud)