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

    相关资源  

  • 相关阅读:
    最长回文子串(马拉车)
    ubutun 启动/停止/重启MySQL数据库
    臭大佬_LZW
    Beauty Contest(求凸包最大直径)
    Smallest Bounding Rectangle(最小面积外接矩形)
    Triangle(求凸包最大内接三角形)
    P4196 [CQOI2006]凸多边形
    P4724 【模板】三维凸包(简洁)
    P2600 [ZJOI2008]瞭望塔【半平面交】
    退役记
  • 原文地址:https://www.cnblogs.com/qianxingmu/p/12532265.html
Copyright © 2020-2023  润新知