通过.NET Core中的SignalR从服务器向客户端发送消息

时间:2019-09-26 13:23:28

标签: .net-core signalr signalr-hub

我想通过SignalR集线器从服务器(从类,而不是控制器)发送消息。

集线器适用于来自客户端的消息,而不适用于来自服务器的消息。

我尝试了多种似乎无效的方法。例如,我尝试使用以下方法检索中心上下文: GlobalHost.ConnectionManager.GetHubContext<MyHub>() 没有成功。

.NET Core中执行此操作的最佳方法是什么?

临时解决方案:

主机api内有一个websocket客户端。然后使其连接到自身。这不是理想的解决方案,但可以作为临时解决方案。

2 个答案:

答案 0 :(得分:1)

您可以将上下文作为服务注入到您的类中。您的班级必须通过DI初始化并添加为服务。类或控制器之间没有区别。

public class SomeClass
{
    public IHubContext<ChatHub, IChatClient> _strongChatHubContext { get; }

    public SomeClass(IHubContext<ChatHub, IChatClient> chatHubContext)
    {
        _strongChatHubContext = chatHubContext;
    }

    public async Task SendMessage(string message)
    {
        await _strongChatHubContext.Clients.All.ReceiveMessage(message);
    }
}

您还可以通过注入IHttpContextAccessor

来获得以下服务
var _strongChatHubContext = httpContextAccessor.HttpContext.RequestServices.GetRequiredService<IHubContext<ChatHub, IChatClient>>()

参考: https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-2.1

答案 1 :(得分:0)

首先,您需要在某个地方实例化集线器(通常是在应用启动时)。

MyHub myHub = new MyHub();

然后在您的课程中插入上下文:

private readonly IHubContext<NotifyHub, ITypedHubClient> hubContext;

然后在您的类方法中调用集线器:

hubContext.Clients.All.yourHubMethod(yourPayload);