欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2023-12-28 17:27:28
...

最近正在学习 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一下。

Asp.Net Core 2.1 中 利用SignalR 服务端主动推送数据 经过大海捞针终于找到另一种临时解决方法。Asp.Net Core 2.1 中 利用SignalR 服务端主动推送数据

具体代码如下

第一步:

创建一个 用于共享的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://*.com/questions/48393429/get-hub-context-in-signalr-core-from-within-another-object

 

上一篇:

下一篇: