从向外发送邮件中心Send messages from outside a hub
本文内容
SignalR 中心是用于将消息发送到客户端连接到 SignalR 服务器的核心抽象。还有可能将消息从你的应用使用中的其他位置发送IHubContext
服务。此文章介绍了如何访问 SignalRIHubContext
将通知发送到外部的客户端从一个中心。
获取 IHubContext 的实例Get an instance of IHubContext
在 ASP.NET Core SignalR,您可以访问的实例IHubContext
通过依赖关系注入。您可以注入的实例IHubContext
到控制器、 中间件或其他 DI 服务。使用的实例将消息发送到客户端。
备注
这不同于 ASP.NET 4.x SignalR GlobalHost 用于提供对访问IHubContext
。ASP.NET Core具有的依赖关系注入框架,无需此全局单一实例。
注入控制器中的 IHubContext 实例Inject an instance of IHubContext in a controller
您可以注入的实例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 实例Get an instance of IHubContext in middleware
访问IHubContext
中间件管道中如下所示:
app.Use(async (context, next) =>
{
var hubContext = context.RequestServices
.GetRequiredService<IHubContext<MyHub>>();
//...
});
备注
外部的从调用集线器方法时Hub
类中,没有与调用相关联的任何调用方。因此,没有不能访问ConnectionId
, Caller
,和Others
属性。
注入强类型化 HubContextInject a strongly-typed HubContext
若要注入强类型化 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);
}
}