在 ASP.NET Core SignalR 中,如何将消息从服​​务器发送到客户端?

In ASP.NET Core SignalR, how do I send a message from the server to a client?

我已经使用新发布的 ASP.NET Core 2.1 成功设置了 SignalR 服务器和客户端。我通过 ChatHub 扩展 Hub 建立了一个聊天室:无论何时从客户端收到一条消息,服务器都会通过 Clients.Others.

将其传回

我还不明白如何向客户发送消息而不是作为对传入消息的响应。如果服务器正在工作并产生结果,我如何获得对 Hub 的访问权限以便向特定客户端发送消息? (或者我什至需要访问 Hub 吗?还有其他发送消息的方法吗?)

搜索此问题很困难,因为大多数结果来自旧版本的 ASP.NET 和 SignalR。

您可以将 IHubContext<T> class 注入服务并使用它调用客户端。

public class NotifyService
{
    private readonly IHubContext<ChatHub> _hub;

    public NotifyService(IHubContext<ChatHub> hub)
    {
        _hub = hub;
    }

    public Task SendNotificationAsync(string message)
    {
        return _hub.Clients.All.SendAsync("ReceiveMessage", message);
    }
}

现在您可以将 NotifyService 注入您的 class 并向所有客户端发送消息:

public class SomeClass
{
    private readonly NotifyService _service;

    public SomeClass(NotifyService service)
    {
        _service = service;
    }

    public Task Send(string message)
    {
        return _service.SendNotificationAsync(message);
    }
}

简单地将 hubcontext 注入您使用 hubcontext 的 class。

您将在那里找到详细信息:

现在有 SignalR HubContext 的官方 Microsoft 文档可以回答您的问题 https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-2.1

但是,是的,正如其他人指出的那样,您需要通过依赖项注入获取 IHubContext 的实例,以访问集线器外部的集线器方法。