.net core 通过.NET内核中的信号器从服务器向客户端发送消息

.net core 通过.NET内核中的信号器从服务器向客户端发送消息,.net-core,signalr,signalr-hub,.net Core,Signalr,Signalr Hub,我想通过信号集线器从服务器(从类而不是控制器)发送消息 集线器适用于来自客户端的消息,但不适用于来自服务器的消息 我已经尝试了多种方法,但这些方法似乎都不管用。例如,我尝试使用以下方法检索中心上下文: GlobalHost.ConnectionManager.GetHubContext() 没有成功 在.NETCore中实现这一点的最佳和最新方法是什么 临时解决方案: 在主机api中具有websocket客户端。然后让它自己连接起来。这不是一个理想的解决方案,但可以作为临时解决方案 首先,您需要

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

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

我已经尝试了多种方法,但这些方法似乎都不管用。例如,我尝试使用以下方法检索中心上下文:
GlobalHost.ConnectionManager.GetHubContext()
没有成功

在.NETCore中实现这一点的最佳和最新方法是什么

临时解决方案:


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

首先,您需要在某个地方实例化您的中心(通常在应用程序启动时)

MyHub MyHub=newmyhub();
然后在类中插入上下文:

专用只读IHubContext hubContext;
在类方法中,只需调用中心:

hubContext.Clients.All.yourHubMethod(yourPayload);

您可以将上下文作为服务注入类中。您的类必须通过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);
    }
}
公共类SomeClass
{
公共IHubContext_strongChatHubContext{get;}
公共SomeClass(IHubContext-chatHubContext)
{
_strong聊天室上下文=聊天室上下文;
}
公共异步任务SendMessage(字符串消息)
{
等待_strongChatHubContext.Clients.All.ReceiveMessage(message);
}
}
您还可以通过注入IHttpContextAccessor获得如下服务

var _strongChatHubContext = httpContextAccessor.HttpContext.RequestServices.GetRequiredService<IHubContext<ChatHub, IChatClient>>()
var\u strongChatHubContext=httpContextAccessor.HttpContext.RequestServices.GetRequiredService()
参考:

当我尝试这样做时,我遇到了一个问题:Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher[8]未能调用集线器方法“SendMessage”。我认为这是因为集线器类“升级”到IHub,并要求我实现其他类,如OnConnected()它只包含一个异常抛出。我似乎也找不到任何关于如何实现这些方法的文档。您使用的是.NET>4.5还是.NET Core?.NET Core。我从.NET库中获取了GlobalHost,因为它不使用.NET核心库(甚至没有显示)。由于它是.NET核心,我将更新我的答案到注入的集线器。您可以尝试这样做:
private readonly IHubContext hubContext可能重复的问题是他不使用控制器。我已经更新了答案。在访问或注入服务时,类和控制器之间没有区别。