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一下。
经过大海捞针终于找到另一种临时解决方法。
具体代码如下
第一步:
创建一个 用于共享的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