ASP.NET Core SignalR (五):从一个中心(hub)之外发送消息
此为系列文章,对MSDN ASP.NET Core SignalR 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解。
SignalR 中心 是核心抽象,其负责发送消息给连接到SignalR中心的客户端。从你的程序的其他地方使用IHubContext
服务来发送消息也是可能的。这篇文章解释了如何访问一个 IHubContext
对象来从一个 中心 外面来发送通知。
获取一个IHubContext实例
在ASP.NET Core SignalR 中,你可以通过依赖注入来访问一个IHubContext的实例。你也可以将IHubContext的实例注入到控制器,中间件,或者其他DI服务中。然后使用这个实例来向客户端发送消息。
注意,这不同于ASP.NET 4.x SignalR,其使用IHubContext 来提供对于 IHubContext 的访问。ASP.NET Core具有一个依赖注入框架,其移除了对于这个全局单例的需要。
在控制器中注入一个IHubContext的实例
你可以通过把一个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的实例
在一个中间件中像这样访问 IHubContext:
app.Use(async (context, next) => { var hubContext = context.RequestServices .GetRequiredService<IHubContext<MyHub>>(); //... });
当中心 方法被从 Hub类外面被调用,那么便没有调用者与此调用有关。因此,也没有办法访问ConnectionId,Caller以及Others
属性。
注入一个强类型的HubContext
为了注入一个强类型的HubContext,请确保你的 Hub 继承自 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); } }
相关资源
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战