【问题标题】:In ASP.NET Core SignalR, how do I send a message from the server to a client?在 ASP.NET Core SignalR 中,如何将消息从服​​务器发送到客户端?
【发布时间】:2018-11-20 03:15:18
【问题描述】:

我已经使用新发布的 ASP.NET Core 2.1 成功设置了 SignalR 服务器和客户端。我通过让我的ChatHub 扩展Hub 建立了一个聊天室:每当有消息从客户端进来时,服务器就会通过Clients.Others 将其弹回。

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

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

【问题讨论】:

标签: c# asp.net-core asp.net-core-signalr


【解决方案1】:

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

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 注入您的类并向所有客户端发送消息:

public class SomeClass
{
    private readonly NotifyService _service;

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

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

【讨论】:

  • 我对这里的 ASP 可能有点幼稚,但是该服务如何帮助我发送消息?如果我在代码的其他地方(大部分 ASP 领域之外)有一些 HandleEvent 函数,我将如何访问该服务、实例化它并使用它?
  • 根据您的问题,我认为您正试图从 ASP 应用程序的不同部分发送消息。如果您尝试从不同的项目/应用程序执行此操作,则需要调用 API 为您发送消息。如果您有一些示例代码来说明您正在尝试做的事情,这可能有助于使事情更清晰
  • 我修正了对 ASP.NET 服务如何工作的理解,现在这个答案更有意义了。我想这就是我需要的。
  • 几个更改:InvokeAsync 现在是 SendAsync (github.com/aspnet/SignalR/issues/1300) 并确保添加命名空间 using Microsoft.AspNetCore.SignalR; 以获得所需的扩展方法。另见github.com/aspnet/SignalR/issues/2239
【解决方案2】:

简单地将 hubcontext 注入到您使用 hubcontext 的类中。

您将在此处找到详细信息:

Call SignalR Core Hub method from Controller

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多