asp.net core 2.0 webapi集成signalr

时间:2021-10-25 08:36:22

在博客园也很多年了,一直不曾分享过什么对象,也没有写过博客,但本身也是汲取着博客园的常识生长的;

这两天想着不能这么无私,比来.NET CORE貌似挺风行的,闲来无事也本身搞了个asp.net core signalr

博客园里面也有人在.net core 2.0下面集成了signalr,但是是集成在同一个项目里面的,但是大家都知道我们很多的项目都是疏散的;

而且signalr涉及到连接数和内存资源的占用问题,如果都集成在一个项目里面当访谒量多大的时候容易造成网站访谒迟缓,具体原因就不久不多说了

所以我这里做了一个在.net core webapi里面集成signalr,我们就可以通过挪用webapi来实现处事器向客户端推送动静

第一步引用nuget:Mrcrosoft.AspNetCore.SignalR

第二步添加配置代码:

首先ConfigureServices里面添加如下代码:

public void ConfigureServices(IServiceCollection services) { services.AddSignalR(); services.AddCors(options => { options.AddPolicy("SignalrCore", policy => policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod()); }); services.AddSingleton<IServiceProvider, ServiceProvider>(); }

然后Configure里面添加

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } //跨域撑持 app.UseCors("SignalrCore"); app.UseSignalR(routes => { routes.MapHub<SignalrHubs>("signalrHubs"); }); app.UseWebSockets(); app.UseMvc(); }

然后我们添加一个hubs

public class SignalrHubs:Hub { /// <summary> /// 创建signalr链接 /// </summary> /// <param>pid(作为用户组)</param> /// <param>sid</param> public Task InitUser(string parentId, string shopId) { Groups.AddAsync(Context.ConnectionId, parentId); SignalrGroups.UserGroups.Add(new SignalrGroups() { ConnectionId = Context.ConnectionId, GroupName = parentId, ShopId = shopId }); return Clients.All.InvokeAsync("NoticeOnline", "用户组数据更新完成,新增id为:" + Context.ConnectionId + " pid:" + parentId + " sid:" + shopId + ""); } public override Task OnDisconnectedAsync(Exception exception) { //失线移除用户 var user = SignalrGroups.UserGroups.FirstOrDefault(c => c.ConnectionId == Context.ConnectionId); if (user != null) { SignalrGroups.UserGroups.Remove(user); Groups.RemoveAsync(Context.ConnectionId, user.GroupName); } return base.OnDisconnectedAsync(exception); } }

PS:我这里是按照本人业务需要来做的,大家可以改削成其他的(用户量大的时候内存占用必定高,这里只做一个简单的例子)

以上根基的环境搭建就已经完成了

接下来控制器里面的代码

[Produces("application/json")] [Route("api/MRSoftPush")] public class MRSoftPushController : Controller { private IHubContext<SignalrHubs> hubContext; public MRSoftPushController(IServiceProvider service) { hubContext = service.GetService<IHubContext<SignalrHubs>>(); } [HttpGet] public string Get() { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"); } /// <summary> /// 单个connectionid推送 /// </summary> /// <param></param> /// <returns></returns> [HttpPost,Route("AnyOne")] public IActionResult AnyOne([FromBody]IEnumerable<SignalrGroups> groups) { if (groups != null && groups.Any()) { var ids = groups.Select(c=>c.ShopId); var list = SignalrGroups.UserGroups.Where(c=>ids.Contains(c.ShopId)); foreach (var item in list) hubContext.Clients.Client(item.ConnectionId).InvokeAsync("AnyOne", $"{item.ConnectionId}: {item.Content}"); } return Ok(); } /// <summary> /// 全部推送 /// </summary> /// <param></param> /// <returns></returns> [HttpGet,Route("EveryOne")] public IActionResult EveryOne(string message) { hubContext.Clients.All.InvokeAsync("EveryOne", $"{message}"); return Ok(); } /// <summary> /// 组推送 /// </summary> /// <param></param> /// <returns></returns> [HttpPost,Route("AnyGroups")] public IActionResult AnyGroups([FromBody]SignalrGroups group) { if (group != null) { hubContext.Clients.Group(group.GroupName).InvokeAsync("AnyGroups", $"{group.Content}"); } return Ok(); } /// <summary> /// 多参数接收方法 /// </summary> /// <param></param> /// <returns></returns> [HttpGet,Route("MoreParamsRequest")] public IActionResult MoreParamsRequest(string message) { hubContext.Clients.All.InvokeAsync("MoreParamsRequest", message, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff")); return Ok(); } }

处事器真个代码到这里全部完成,接下来咱们看客户真个代码

我的客户端代码是在此外一个项目里面,和处事器端是疏散的