1. 程式人生 > >Asp.Net Core 2.1 中 利用SignalR 服務端主動推送資料

Asp.Net Core 2.1 中 利用SignalR 服務端主動推送資料

最近正在學習 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>>();
     }



解決方法原地址: