我想通过SignalR集线器从服务器(从类,而不是控制器)发送消息。
集线器适用于来自客户端的消息,而不适用于来自服务器的消息。
我尝试了多种似乎无效的方法。例如,我尝试使用以下方法检索中心上下文:
GlobalHost.ConnectionManager.GetHubContext<MyHub>()
没有成功。
.NET Core中执行此操作的最佳方法是什么?
临时解决方案:
主机api内有一个websocket客户端。然后使其连接到自身。这不是理想的解决方案,但可以作为临时解决方案。
答案 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);