asp.net core 2.0 webapi集成signalr(實(shí)例講解)
在博客園也很多年了,一直未曾分享過什么東西,也沒有寫過博客,但自己也是汲取著博客園的知識(shí)成長(zhǎng)的;
這兩天想著不能這么無私,最近.NET CORE貌似挺流行的,閑來無事也自己搞了個(gè)asp.net core signalr
博客園里面也有人在.net core 2.0下面集成了signalr,但是是集成在同一個(gè)項(xiàng)目里面的,但是大家都知道我們很多的項(xiàng)目都是分離的;
而且signalr涉及到連接數(shù)和內(nèi)存資源的占用問題,如果都集成在一個(gè)項(xiàng)目里面當(dāng)訪問量多大的時(shí)候容易造成網(wǎng)站訪問緩慢,具體原因就不多說了
所以我這里做了一個(gè)在.net core webapi里面集成signalr,我們就可以通過調(diào)用webapi來實(shí)現(xiàn)服務(wù)器向客戶端推送消息
第一步引用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(); }
然后我們添加一個(gè)hubs
public class SignalrHubs:Hub { /// <summary> /// 創(chuàng)建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", "用戶組數(shù)據(jù)更新完成,新增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:我這里是根據(jù)本人業(yè)務(wù)需要來做的,大家可以修改成其他的(用戶量大的時(shí)候內(nèi)存占用肯定高,這里只做一個(gè)簡(jiǎn)單的例子)
以上基本的環(huán)境搭建就已經(jīng)完成了
接下來控制器里面的代碼
[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> /// 單個(gè)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> /// 多參數(shù)接收方式 /// </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(); } }
服務(wù)器端的代碼到這里全部完成,接下來咱們看客戶端的代碼
我的客戶端代碼是在另外一個(gè)項(xiàng)目里面,和服務(wù)器端是分離的
<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;\">單個(gè)用戶組推送:" + data + "</li>"); }); hubConnection.on('AnyOne', data => { $("#message").append("<li style=\"color:blue;\">單個(gè)ID推送:" + data + "</li>"); }); hubConnection.on('MoreParamsRequest', (message, date) => { $("#message").append("<li style=\"color:green;\">多參數(shù)接收:" + message + " : " + data + "</li>"); }); hubConnection.start(); }); </script> }
頁面上引用連個(gè)js
<script src="/js/signalr-client.min.js"></script>
<script src="/js/jquery.min.js"></script>
到這里基本就已經(jīng)完成了,下面看一下運(yùn)行效果
第一次寫博客,有點(diǎn)緊張,代碼寫得比較倉(cāng)促,很多細(xì)節(jié)都沒有優(yōu)化,有很多不足之處,望各位多多指正
以上這篇asp.net core 2.0 webapi集成signalr(實(shí)例講解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
VB.NET驗(yàn)證郵件地址的合法性實(shí)現(xiàn)代碼
現(xiàn)在,對(duì)于用戶在Web頁面上或電話中給出的Email地址,我們?cè)絹碓讲桓铱隙ㄋ欠裾娴挠行АT诮裉爝@個(gè)垃圾郵件泛濫成災(zāi)的年代,人們完全有理由舍不得輕易透露Email地址。2011-04-04ASP.NET對(duì)路徑"xxxxx"的訪問被拒絕的解決方法小結(jié)
異常詳細(xì)信息: System.UnauthorizedAccessException: 對(duì)路徑“D:/temp1/MyTest.txt”的訪問被拒絕2012-09-09在Apache環(huán)境下成功的運(yùn)行ASP.NET的注意事項(xiàng)
在Apache環(huán)境下成功的運(yùn)行ASP.NET的注意事項(xiàng)...2007-08-08ASP.NET實(shí)現(xiàn)Hadoop增刪改查的示例代碼
本篇文章主要介紹了ASP.NET實(shí)現(xiàn)Hadoop增刪改查的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10詳解ASP.NET MVC下的異步Action的定義和執(zhí)行原理
這篇文章主要介紹了詳解ASP.NET MVC下的異步Action的定義和執(zhí)行原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12ASP.NET編程簡(jiǎn)單實(shí)現(xiàn)生成靜態(tài)頁面的方法【附demo源碼下載】
這篇文章主要介紹了ASP.NET編程簡(jiǎn)單實(shí)現(xiàn)生成靜態(tài)頁面的方法,較為詳細(xì)的分析了asp.net生成靜態(tài)頁面的步驟與相關(guān)操作技巧,并附帶相關(guān)實(shí)例源碼供讀者下載參考,需要的朋友可以參考下2017-07-07