从向外发送邮件中心Send messages from outside a hub

本文内容

通过Mikael Mengistu

SignalR 中心是用于将消息发送到客户端连接到 SignalR 服务器的核心抽象。还有可能将消息从你的应用使用中的其他位置发送IHubContext服务。此文章介绍了如何访问 SignalRIHubContext将通知发送到外部的客户端从一个中心。

查看或下载示例代码(如何下载)

获取 IHubContext 的实例Get an instance of IHubContext

在 ASP.NET Core SignalR,您可以访问的实例IHubContext通过依赖关系注入。您可以注入的实例IHubContext到控制器、 中间件或其他 DI 服务。使用的实例将消息发送到客户端。

备注

这不同于 ASP.NET 4.x SignalR GlobalHost 用于提供对访问IHubContextASP.NET Core具有的依赖关系注入框架,无需此全局单一实例。

注入控制器中的 IHubContext 实例Inject an instance of IHubContext in a controller

您可以注入的实例IHubContext插入控制器将其添加到您的构造函数:

  1. public class HomeController : Controller
  2. {
  3. private readonly IHubContext<NotificationHub> _hubContext;
  4. public HomeController(IHubContext<NotificationHub> hubContext)
  5. {
  6. _hubContext = hubContext;
  7. }
  8. }

现在,有权访问的实例IHubContext,好像您在中心本身中,可以调用集线器方法。

  1. public async Task<IActionResult> Index()
  2. {
  3. await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}");
  4. return View();
  5. }

获取中间件中的 IHubContext 实例Get an instance of IHubContext in middleware

访问IHubContext中间件管道中如下所示:

  1. app.Use(async (context, next) =>
  2. {
  3. var hubContext = context.RequestServices
  4. .GetRequiredService<IHubContext<MyHub>>();
  5. //...
  6. });

备注

外部的从调用集线器方法时Hub类中,没有与调用相关联的任何调用方。因此,没有不能访问ConnectionIdCaller,和Others属性。

注入强类型化 HubContextInject a strongly-typed HubContext

若要注入强类型化 HubContext,请确保你的中心继承Hub<T>将使用其注入IHubContext<THub, T>接口而非IHubContext<THub>

  1. public class ChatController : Controller
  2. {
  3. public IHubContext<ChatHub, IChatClient> _strongChatHubContext { get; }
  4. public ChatController(IHubContext<ChatHub, IChatClient> chatHubContext)
  5. {
  6. _strongChatHubContext = chatHubContext;
  7. }
  8. public async Task SendMessage(string message)
  9. {
  10. await _strongChatHubContext.Clients.All.ReceiveMessage(message);
  11. }
  12. }

相关资源Related resources