使用 Aspnetcore.signalr 库从 Hub 外部获取 HubContext(不是从 Controller)

Get HubContext from outside of Hub using Aspnetcore.signalr libray (not from Controller)

我正在使用 AspNetCore.SignalR 开发 SignalR 服务。

以下是我的中心:

public class NotificationHub : Microsoft.AspNetCore.SignalR.Hub
    {
        public override async Task OnConnectedAsync()
        {
            await base.OnConnectedAsync();
        }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            await base.OnDisconnectedAsync(exception);
        }
    }

以下是我创建的用于在客户端调用 Hub 方法的另一个上下文 class:

public class NotificationHubContext
    {
        private readonly IHubContext<NotificationHub> _context;

        public NotificationHubContext(IHubContext<NotificationHub> context)
        {
            _context = context;
        }

        public async Task Broadcast(string groupId, string eventName, object data)
        {
            await _context.Clients.Group(groupId).SendAsync(eventName, data);
        }
    }

我想将 NotificationContext class 的引用注入到我自己的 IoC 容器中,这样我就可以解析它并在其上调用 BroadCast 方法,它应该处理向客户端发送消息。

我正在使用服务总线来侦听来自系统另一部分的消息,一旦我收到来自队列的消息,我想使用来自 QueueHandler 的 HubContext 通知已连接的客户端。

Assembly Info

var hubContext = app.ApplicationServices.GetService<IHubContext<Notification>>

这解决了我的问题。

我的 class 设计如下。

public class NotificationHub : Microsoft.AspNetCore.SignalR.Hub
{
    public static IHubContext<NotificationHub> Current { get; set; }
}

在你的启动中class

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    NotificationHub.Current = app.ApplicationServices.GetService<IHubContext<NotificationFromServerHub>>();

}

因此,您可以在任何地方像这样使用。

public class MyBizClass
{
    public void DoSomething()
    {
        NotificationHub.Current.MyMethod(...);
    }
}