Asp.Net Core 2.1 中 利用SignalR 服務端主動推送資料
阿新 • • 發佈:2019-02-09
最近正在學習 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>>(); }
解決方法原地址: