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

时间:2018-05-30 02:06:21

标签: signalr signalr-hub asp.net-core-signalr signalr-backplane signalr-2

我正在使用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方法创建的另一个Context类:

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类的引用注入到我自己的IoC容器中,这样我就可以解决它并在其上调用BroadCast方法,它应该处理向客户端发送消息。

我正在使用Service Bus来侦听来自系统其他部分的消息,一旦我收到来自Queue的消息,我想使用来自QueueHandler的HubContext通知已连接的客户端。

Assembly Info

2 个答案:

答案 0 :(得分:0)

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

这解决了我的问题。

答案 1 :(得分:0)

我的课堂设计如下。

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

在您的启动课程中

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

}

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

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