Asp.Net Core 2.1 中 利用SignalR 服务端主动推送数据

本文介绍了一种在ASP.NET Core中使用SignalR进行数据推送的方法。通过创建一个共享Hub约束类,并在Startup文件中配置服务,实现了服务端主动向客户端推送数据的功能。

最近正在学习 SignalR 在Asp.Net Core中的应用(数据推送等等。。。)。以下为个人学习时遇到问题的记录和解决方法。

对于Asp.Net Core我也是刚刚学习,所以不保证完全正确。如果有错误还请大家指正,多谢多谢!!!

在完整版(传统版)的 Asp.Net  程序中 利用SignalR 主动推送数据一般我习惯用

GlobalHost.ConnectionManager.GetHubContext<MyHub>();

来获取IHubContext。

但是在Asp.Net Core中 目前的版本还没有 GlobalHost

ps : 我在网上查到 Microsoft.AspNetCore.SignalR.Server 这个包也可以进行 Asp.Net Core中利用SignalR进行服务端主动推送数据。但是这个包现在在NuGet中 甚至还没有预览版。只有在其他源(dotnet.myget.org)里才有。感兴趣的可以Bing一下。

奋斗 经过大海捞针终于找到另一种临时解决方法。奋斗

具体代码如下

第一步:

创建一个 用于共享的Hub约束类

public class GlobalHubServer<THub> where THub : Hub
    {
        private readonly IHubContext<THub> _hubContext;

        public GlobalHubServer(IHubContext<THub> hubContext)
        {
            _hubContext = hubContext;
        }

        public Task InvokeOnGroupAsync(string groupName, string method, params object[] args) =>
            _hubContext.Clients.Group(groupName).SendAsync(method, args);

        public Task InvokeOnAllAsync(string method, params object[] args) =>
            _hubContext.Clients.All.SendAsync(method, args);
        public Task InvokeByIDAsync(string id, string method, params object[] args) =>
            _hubContext.Clients.Client(id).SendAsync(method, args);

        public Task AddConnectionIdToGroupAsync(string connectionId, string groupName) =>
            _hubContext.Groups.AddToGroupAsync(connectionId, groupName);

    }

第二部:

在 hub中 添加 默认构造

    public class LinkHubs : Hub
    {
        private readonly GlobalHubServer<LinkHubs> _hubMethods;

        public LinkHubs(GlobalHubServer<LinkHubs> hubMethods)
        {
            _hubMethods = hubMethods;
        }


        public override Task OnConnectedAsync()
        {
            //this.Clients.All.SendAsync("ReceiveMessage", string.Format("ID:{0} 已经连接到SignalR.", this.Context.ConnectionId));
            return base.OnConnectedAsync();
        }

        ...

    }

第三步:

在 Startup 文件中添加如下代码

   public void ConfigureServices(IServiceCollection services)
        {
            。。。
            services.AddTransient<GlobalHubServer<LinkHubs>>();
            。。。
        }
public static GlobalHubServer<LinkHubs> GlobalHub { get; private set; }

public void Configure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
     {
         。。。
         //在此
         GlobalHub = serviceProvider.GetService<GlobalHubServer<LinkHubs>>();
     }



解决方法原地址:

https://stackoverflow.com/questions/48393429/get-hub-context-in-signalr-core-from-within-another-object


                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值