ASP.NET?Core實(shí)時庫SignalR簡介及使用
何為實(shí)時
先從理論上解釋一下兩者的區(qū)別。
大多數(shù)傳統(tǒng)的web應(yīng)用是這樣的:客戶端發(fā)起http請求到服務(wù)端,服務(wù)端返回對應(yīng)的結(jié)果。像這樣:
也就是說,傳統(tǒng)的web應(yīng)用都是客戶端主動發(fā)起請求到服務(wù)端。
那么實(shí)時web應(yīng)用呢?它不需要主動發(fā)起請求,服務(wù)端可以主動推送信息到客戶端。
舉栗子的話,實(shí)時聊天工具、web游戲等都可以算是實(shí)時應(yīng)用。
什么是SignalR
如果想做一個實(shí)時應(yīng)用,最好用web socket。很早以前我也寫過web socket的實(shí)現(xiàn)方式,但不夠全面,這里再補(bǔ)上一篇。
來說說signalR,它是一款開源的實(shí)時框架,可以使用三種方式實(shí)現(xiàn)通信(long polling、server sent events、web socket)。它很好的整合了底層技術(shù),讓我們可以不用關(guān)注底層技術(shù)實(shí)現(xiàn)而把精力聚焦在業(yè)務(wù)實(shí)現(xiàn)上。一個完整的signalR包括客戶端和服務(wù)端,服務(wù)端支持net core/net framework,還支持大部分客戶端,比如瀏覽器和桌面應(yīng)用。
回落機(jī)制
為了兼容不同瀏覽器(客戶端)和服務(wù)端,signalR采用了回落機(jī)制,使得它可以根據(jù)情況協(xié)商使用不同的底層傳輸方式。假如瀏覽器不支持web socket,就自動降級使用sse,再不行就long polling。當(dāng)然,也可以禁用這種機(jī)制,指定其中一種。
三種通信方式
long polling(長輪詢)
長輪詢是客戶端發(fā)起請求到服務(wù)端,服務(wù)器有數(shù)據(jù)就會直接返回。如果沒有數(shù)據(jù)就保持連接并且等待,一直到有新的數(shù)據(jù)返回。如果請求保持到一段時間仍然沒有返回,這時候就會超時,然后客戶端再次發(fā)起請求。
這種方式優(yōu)點(diǎn)就是簡單,缺點(diǎn)就是資源消耗太多,基本是不考慮的。
server sent events(sse)
如果使用了sse,服務(wù)器就擁有了向客戶端推送的能力,這些信息和流信息差不多,期間會保持連接。
這種方式優(yōu)點(diǎn)還是簡單,也支持自動重連,綜合來講比long polling好用。缺點(diǎn)也很明顯,不支持舊的瀏覽器不說,還只能發(fā)送本文信息,而且瀏覽器對sse還有連接數(shù)量的限制(6個)。
web socket
web socket允許客戶端和服務(wù)端同時向?qū)Ψ桨l(fā)送消息(也就是雙工通信),而且不限制信息類型。雖然瀏覽器同樣有連接數(shù)量限制(可能是50個),但比sse強(qiáng)得多。理論上最優(yōu)先使用。
進(jìn)入正題
開始之前,還需要了解RPC和Hub的概念。
- RPC:全稱Remote Procedure Call,字面意思遠(yuǎn)程服務(wù)調(diào)用,可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)。前端可以調(diào)用后端方法,后端也可以調(diào)用前端方法。
- Hub:基于RPC,接受從客戶端發(fā)過來的消息,也同時負(fù)責(zé)把服務(wù)端的消息發(fā)送給客戶端??蛻舳丝梢哉{(diào)用Hub里面的方法,服務(wù)端可以通過Hub調(diào)用客戶端里面的方法。
好了,概念已經(jīng)理解清楚了,接下來上代碼。
在項(xiàng)目里新增Hub類:
using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRDemo.Server { public class SignalRHub : Hub { /// <summary> /// 客戶連接成功時觸發(fā) /// </summary> /// <returns></returns> public override async Task OnConnectedAsync() { var cid = Context.ConnectionId; //根據(jù)id獲取指定客戶端 var client = Clients.Client(cid); //向指定用戶發(fā)送消息 await client.SendAsync("Self", cid); //像所有用戶發(fā)送消息 await Clients.All.SendAsync("AddMsg", $"{cid}加入了聊天室"); } } }
為了讓外部可以訪問,我們還需要一個控制器。在控制器里聲明隨便建一個:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using SignalRDemo.Server; using System.Threading.Tasks; namespace SignalRDemo.Controllers { public class HomeController : Controller { private readonly IHubContext<SignalRHub> _countHub; public HomeController(IHubContext<SignalRHub> countHub) { _countHub = countHub; } /// <summary> /// 發(fā)送信息 /// </summary> /// <param name="msg"></param> /// <param name="id"></param> /// <returns></returns> public async Task Send(string msg, string id) { await _countHub.Clients.All.SendAsync("AddMsg", $"{id}:{msg}"); } } }
再然后進(jìn)入StartUp設(shè)置端點(diǎn):
endpoints.MapHub<SignalRHub>("/hub");
完成以后,配置signalr客戶端:
setupConn = () => { conn = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); conn.on("AddMsg", (obj) => { $('#msgPanel').append(`<p>${obj}</p>`); }); conn.on("Finished", () => { conn.stop(); $('#msgPanel').text('log out!'); }); conn.on("Self", (obj) => { $('#userId').text(obj); }); conn.start() .catch(err => console.log(err)); }
要注意withUrl里面的路徑就是之前設(shè)置好的端點(diǎn)。
運(yùn)行效果:
Hub還支持組操作,比如:
//將用戶添加到A組 await Groups.AddToGroupAsync(Context.ConnectionId, "GroupA"); //將用戶踢出A組 await Groups.RemoveFromGroupAsync(Context.ConnectionId, "GroupA"); //向A組所有成員廣播消息 await Clients.Group("GroupA").SendAsync("AddMsg", "群組消息");
更多操作請參考官方文檔。
本文演示demo的源碼見git,地址:https://gitee.com/muchengqingxin/SignalRDemo.git
到此這篇關(guān)于ASP.NET Core實(shí)時庫SignalR簡介及使用的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET中畫圖形驗(yàn)證碼的實(shí)現(xiàn)代碼
這篇文章給大家介紹了asp.net中畫圖形驗(yàn)證碼的實(shí)現(xiàn)方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-01-01C#反射實(shí)例學(xué)習(xí)及注意內(nèi)容
C#反射的入門學(xué)習(xí)首先要明白C#反射提供了封裝程序集、模塊和類型的對象等等需要的朋友可以參考下2012-12-12排除JQuery通過HttpGet調(diào)用WebService返回Json時“parserror”錯誤
排除JQuery通過HttpGet調(diào)用WebService返回Json時“parserror”錯誤的解決方法。2011-10-10Visual studio 2017如何發(fā)布dotnet core到docker
這篇文章主要介紹了Visual studio 2017如何發(fā)布dotnet core到docker的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04使用Ajax更新ASP.Net MVC項(xiàng)目中的報表對象方法
下面小編就為大家分享一篇使用Ajax更新ASP.Net MVC項(xiàng)目中的報表對象方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01asp.net 簡單驗(yàn)證碼驗(yàn)證實(shí)現(xiàn)代碼
網(wǎng)站開發(fā)一般登錄注冊的時候都要用到了 所以寫下來給大家參考參考2009-09-09