此為系列文章,對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); } }
相關資源
