SignalR 中心是用于将消息发送到客户端连接到 SignalR 服务器的核心抽象。 还有可能将消息从你的应用使用中的其他位置发送IHubContext
服务。 此文章介绍了如何访问 SignalRIHubContext
将通知发送到外部的客户端从一个中心。
在 ASP.NET Core SignalR,您可以访问的实例IHubContext
通过依赖关系注入。 您可以注入的实例IHubContext
到控制器、 中间件或其他 DI 服务。 使用的实例将消息发送到客户端。
备注
这不同于 ASP.NET 4.x SignalR GlobalHost 用于提供对访问IHubContext
。 ASP.NET Core具有的依赖关系注入框架,无需此全局单一实例。
您可以注入的实例IHubContext
插入控制器将其添加到您的构造函数:
public class HomeController : Controller { private readonly IHubContext<NotificationHub> _hubContext; public HomeController(IHubContext<NotificationHub> hubContext) { _hubContext = hubContext; } }
现在,有权访问的实例IHubContext
,好像您在中心本身中,可以调用集线器方法。
public async Task<IActionResult> Index() { await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}"); return View(); }
访问IHubContext
中间件管道中如下所示:
app.Use(async (context, next) => { var hubContext = context.RequestServices .GetRequiredService<IHubContext<MyHub>>(); //... });
备注
外部的从调用集线器方法时Hub
类中,没有与调用相关联的任何调用方。 因此,没有不能访问ConnectionId
, Caller
,和Others
属性。
若要注入强类型化 HubContext,请确保你的中心继承Hub<T>
。 将使用其注入IHubContext<THub, T>
接口而非IHubContext<THub>
。
public class ChatController : Controller { public IHubContext<ChatHub, IChatClient> _strongChatHubContext { get; } public ChatController(IHubContext<ChatHub, IChatClient> chatHubContext) { _strongChatHubContext = chatHubContext; } public async Task SendMessage(string message) { await _strongChatHubContext.Clients.All.ReceiveMessage(message); } }