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);
    }
}

相關資源  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM