最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

asp.net core 2.0 webapi集成signalr(实例讲解)

来源:懂视网 责编:小采 时间:2020-11-27 22:35:12
文档

asp.net core 2.0 webapi集成signalr(实例讲解)

asp.net core 2.0 webapi集成signalr(实例讲解):在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的; 这两天想着不能这么无私,最近.NET CORE貌似挺流行的,闲来无事也自己搞了个asp.net core signalr 博客园里面也有人在.net core 2.0下面集成
推荐度:
导读asp.net core 2.0 webapi集成signalr(实例讲解):在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的; 这两天想着不能这么无私,最近.NET CORE貌似挺流行的,闲来无事也自己搞了个asp.net core signalr 博客园里面也有人在.net core 2.0下面集成

在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的;

这两天想着不能这么无私,最近.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 name="parentId">pid(作为用户组)</param>
 /// <param name="shopId">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 name="groups"></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 name="message"></param>
 /// <returns></returns>
 [HttpGet,Route("EveryOne")]
 public IActionResult EveryOne(string message)
 {
 hubContext.Clients.All.InvokeAsync("EveryOne", $"{message}");
 return Ok();
 }

 /// <summary>
 /// 组推送
 /// </summary>
 /// <param name="group"></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 name="message"></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();
 }
 }

服务器端的代码到这里全部完成,接下来咱们看客户端的代码

我的客户端代码是在另外一个项目里面,和服务器端是分离的

<input type="text" id="ParentId" placeholder="ParentId" />
<br />
<input type="text" id="ShopId" placeholder="ShopId" />
<br />
<button id="fuckyou">用户上线</button>
<br />
<br />
<br />

<ul id="message" ></ul>

@section scripts {
 <script>
 $(function () {

 let hubUrl = 'http://192.168.0.149:8009/signalrHubs';
 let httpConnection = new signalR.HttpConnection(hubUrl);
 let hubConnection = new signalR.HubConnection(httpConnection);
 $("#fuckyou").click(function () {
 hubConnection.invoke('InitUser', $("#ParentId").val(), $("#ShopId").val());
 });
 hubConnection.on('NoticeOnline', data => {
 $("#message").append("<li>" + data + "</li>");
 });
 hubConnection.on('EveryOne', data => {
 $("#message").append("<li style=\"color:red;\">全部推送:" + data + "</li>");
 });
 hubConnection.on('AnyGroups', data => {
 $("#message").append("<li style=\"color:black;\">单个用户组推送:" + data + "</li>");
 });
 hubConnection.on('AnyOne', data => {
 $("#message").append("<li style=\"color:blue;\">单个ID推送:" + data + "</li>");
 });
 hubConnection.on('MoreParamsRequest', (message, date) => {
 $("#message").append("<li style=\"color:green;\">多参数接收:" + message + " : " + data + "</li>");
 });
 hubConnection.start();

 });
 </script>
}

页面上引用连个js

<script src="https://www.gxlcms.com/js/signalr-client.min.js"></script>
<script src="https://www.gxlcms.com/js/jquery.min.js"></script>

到这里基本就已经完成了,下面看一下运行效果

第一次写博客,有点紧张,代码写得比较仓促,很多细节都没有优化,有很多不足之处,望各位多多指正

以上这篇asp.net core 2.0 webapi集成signalr(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

asp.net core 2.0 webapi集成signalr(实例讲解)

asp.net core 2.0 webapi集成signalr(实例讲解):在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的; 这两天想着不能这么无私,最近.NET CORE貌似挺流行的,闲来无事也自己搞了个asp.net core signalr 博客园里面也有人在.net core 2.0下面集成
推荐度:
标签: 2.0 实例 net
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top