利用SignalR實(shí)現(xiàn)實(shí)時(shí)推送信息
前言
下面將給大家分享有關(guān)于SignalR的技術(shù)的一種應(yīng)用。
一、什么是SignalR?
SignalR是一個(gè)ASP .NET下的類(lèi)庫(kù),可以在ASP .NET的Web項(xiàng)目中實(shí)現(xiàn)實(shí)時(shí)通信。
什么是實(shí)時(shí)通訊?
就是當(dāng)所連接的客戶(hù)端變得可用時(shí)服務(wù)器代碼可以立即向其推送內(nèi)容,而不是讓服務(wù)器等待客戶(hù)端請(qǐng)求新的數(shù)據(jù)。
當(dāng)WebSockets可用時(shí)(即瀏覽器支持Html5,SignalR使用WebSockets,當(dāng)不支持時(shí)SignalR將使用其它技術(shù)來(lái)保證達(dá)到相同效果。
二、主要用途
它出現(xiàn)的主要目的是實(shí)現(xiàn)服務(wù)器主動(dòng)推送(Push)消息到客戶(hù)端頁(yè)面,這樣客戶(hù)端就不必重新發(fā)送請(qǐng)求或使用輪詢(xún)技術(shù)來(lái)獲取消息。
可以用在聊天室、看板、單點(diǎn)通訊、多點(diǎn)通訊,甚至可以結(jié)合其他技術(shù)用來(lái)做視頻聊天。當(dāng)然也有其他用途。
三、實(shí)現(xiàn)機(jī)制
SignalR 的實(shí)現(xiàn)機(jī)制與 .NET WCF是相似的,都是使用遠(yuǎn)程代理來(lái)實(shí)現(xiàn)。
在具體使用上,有兩種不同目的的接口:PersistentConnection 和 Hubs,其中 PersistentConnection 是實(shí)現(xiàn)了長(zhǎng)時(shí)間的 JavaScript 輪詢(xún)(類(lèi)似于 Comet),Hub 是用來(lái)解決實(shí)時(shí)信息交換問(wèn)題,它是利用 Javascript 動(dòng)態(tài)載入執(zhí)行方法實(shí)現(xiàn)的。SignalR 將整個(gè)連接,信息交換過(guò)程封裝得非常漂亮,客戶(hù)端與服務(wù)器端全部使用 JSON 來(lái)交換數(shù)據(jù)。
四、基本流程圖

五、示例
以下教程我會(huì)就 Hubs 接口的使用來(lái)做一個(gè)實(shí)時(shí)看板:
示例環(huán)境:
.NET Framework 4.5及以上(必須要)?
Win10、Visual Stadio 2017 、SQL2014
1、新建項(xiàng)目,打開(kāi)NuGet包管理器,安裝SignalR.最新版本,我這里的版本是V2.2.1.
如圖:

2、 在App_Start目錄中,創(chuàng)建一個(gè)類(lèi),類(lèi)名為Startup:

3、 在Startup.cs中注冊(cè)管道:

4、設(shè)置webconfig。建立一個(gè)類(lèi)DB:目的是獲取webconfig文件中的數(shù)據(jù)庫(kù)連接字符串:


5、 我們需要在Global.asax.cs的Application_Start和Application_End方法中添加以下內(nèi)容:

此處的sqlDependency作用:
當(dāng)被監(jiān)測(cè)的數(shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)生變化時(shí),SqlDependency會(huì)自動(dòng)觸發(fā)OnChange事件來(lái)通知應(yīng)用程序,從而達(dá)到讓系統(tǒng)自動(dòng)更新數(shù)據(jù)(或緩存)的目的。詳情看第8步。
6、建個(gè)Model,TableA。這里就只有X,Y,Z三個(gè)字段:

再到數(shù)據(jù)庫(kù)中建立相對(duì)于的數(shù)據(jù)庫(kù)和表。
注意:建完表后記得啟動(dòng)SQL Server Service Broker。
啟動(dòng)SQL Server Service Broker 其中([SignalR]為數(shù)據(jù)庫(kù)名)
ALTER DATABASE [SignalR] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [SignalR] SET ENABLE_BROKER;
7、在項(xiàng)目錄中,創(chuàng)建一個(gè)SignalR目錄,我們就可以在這個(gè)目錄中添加Hub類(lèi)了:

記得使用小駝峰命名,不然客戶(hù)端調(diào)用不了。
8、實(shí)現(xiàn)去數(shù)據(jù)庫(kù)獲取數(shù)據(jù),當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)變化時(shí),客戶(hù)端也能實(shí)時(shí)顯示:


其中以下代碼是根據(jù)數(shù)據(jù)庫(kù)檢測(cè)到的變化的內(nèi)容觸發(fā)OnChange事件。
SqlDependency dependency = new SqlDependency(sqlCommand);
dependency.OnChange += new OnChangeEventHandler(dependency_Onchange);9、建一個(gè)控制器:兩個(gè)Action操作

10、視圖



到了,到此為止本教程基本結(jié)束了,下面將會(huì)是本教程的實(shí)際效果。
這是數(shù)據(jù)庫(kù)中這張表的數(shù)據(jù)

現(xiàn)在把第二行第二列的5修改為9。

由此可見(jiàn)所有連接的客戶(hù)端的值也跟著改變了,這樣實(shí)時(shí)推送的功能也就實(shí)現(xiàn)了。
關(guān)于SignalR的相關(guān)內(nèi)容就介紹那么多了,更多SignalR的技術(shù)內(nèi)容大家也可以自行挖掘一下。
