使用 IHubContext 实例化 SignalR Hub 对象

问题描述 投票:0回答:2

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

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

c# asp.net signalr signalr-hub sqldependency
2个回答
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);
    }      
}

假设您正在使用

SqlDependency
中的
IHostedService
:

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

用于 ASP.NET 的 SignalR

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.sendMessage(message);

0
投票

您需要使用

Microsoft.AspNet.SignalR
库。

using Microsoft.AspNet.SignalR;

//Instantiating. SignalRHub is the hub name.
var context = GlobalHost.ConnectionManager.GetHubContext<SignalRHub>();

//sends message
context.Clients.Client(ClientId).sendMessage(data);
© www.soinside.com 2019 - 2024. All rights reserved.