使用IHubContext实例化SignalR集线器对象

时间:2018-07-10 23:22:05

标签: c# asp.net signalr signalr-hub sqldependency

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

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

2 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分: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);