【问题标题】:Send messages from server to client via SignalR in .NET Core通过 .NET Core 中的 SignalR 将消息从服​​务器发送到客户端
【发布时间】:2019-09-26 13:23:28
【问题描述】:

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

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

我尝试了多种方法,但似乎都不起作用。例如,我尝试使用以下方法检索集线器上下文: GlobalHost.ConnectionManager.GetHubContext<MyHub>() 没有成功。

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

临时解决方案:

在主机 api 中有一个 websocket 客户端。然后让它连接到自己。这不是一个理想的解决方案,但可以作为临时解决方案。

【问题讨论】:

标签: .net-core signalr signalr-hub


【解决方案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

【讨论】:

  • 问题说他不使用控制器。
  • 我已经更新了答案。访问或注入服务时,类和控制器没有区别。
【解决方案2】:

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

MyHub myHub = new MyHub();

然后在你的类上注入上下文:

private readonly IHubContext<NotifyHub, ITypedHubClient> hubContext;

在你的类方法中只需调用集线器:

hubContext.Clients.All.yourHubMethod(yourPayload);

【讨论】:

  • 当我尝试这样做时遇到问题失败:Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher[8] 无法调用集线器方法“SendMessage”。
  • 我相信这是因为 Hub 类被“升级”到 IHub 并要求我实现其他类,例如 OnConnected(),其中不包含任何代码,而不是异常抛出。我似乎也找不到任何关于如何实现这些方法的文档。
  • 您使用的是 .NET > 4.5 还是 .NET Core?
  • .NET 核心。我从 .NET 库中获取了 GlobalHost,因为它不能与 .NET Core 库一起使用(甚至没有显示)。
  • 因为它的 .NET Core 我将更新我对注入集线器的回答。你可以试试这个:private readonly IHubContext&lt;MyHub&gt; hubContext;
猜你喜欢
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多