利用SignalR實(shí)現(xiàn)實(shí)時(shí)推送信息功能

一段時(shí)間沒(méi)寫簡(jiǎn)書了,感謝這段時(shí)間以來(lái)不斷收到大家的支持和喜歡,讓我感覺(jué)到自己寫的一些東西還是能為大家提供一些小小的幫助的,是你們給了我動(dòng)力繼續(xù)寫文章和教程,在此表示再次的感謝。下面將給大家分享的是有關(guān)于SignalR的技術(shù)的一種應(yīng)用。

一、什么是SignalR?
SignalR 是一個(gè)ASP .NET 下的類庫(kù),可以在ASP .NET 的Web項(xiàng)目中實(shí)現(xiàn)實(shí)時(shí)通信。
什么是實(shí)時(shí)通訊?
就是當(dāng)所連接的客戶端變得可用時(shí)服務(wù)器代碼可以立即向其推送內(nèi)容,而不是讓服務(wù)器等待客戶端請(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)消息到客戶端頁(yè)面,這樣客戶端就不必重新發(fā)送請(qǐng)求或使用輪詢技術(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 輪詢(類似于 Comet),Hub 是用來(lái)解決實(shí)時(shí)信息交換問(wèn)題,它是利用 Javascript 動(dòng)態(tài)載入執(zhí)行方法實(shí)現(xiàn)的。SignalR 將整個(gè)連接,信息交換過(guò)程封裝得非常漂亮,客戶端與服務(wù)器端全部使用 JSON 來(lái)交換數(shù)據(jù)。

四、基本流程圖:

Paste_Image.png

五、示例:
以下教程我會(huì)就 Hubs 接口的使用來(lái)做一個(gè)實(shí)時(shí)看板:
示例環(huán)境:.NET Framework4.5及以上(必須要) WIN10,Visual Stadio 2017 ,SQL2014.

1、新建項(xiàng)目,打開(kāi)NuGet包管理器,安裝SignalR.最新版本,我這里的版本是V2.2.1.
如圖:


Paste_Image.png

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


Paste_Image.png

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


Paste_Image.png

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


Paste_Image.png
Paste_Image.png

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


Paste_Image.png

此處的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è)字段:


Paste_Image.png

再到數(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類了:


Paste_Image.png

記得使用小駝峰命名,不然客戶端調(diào)用不了。

8、實(shí)現(xiàn)去數(shù)據(jù)庫(kù)獲取數(shù)據(jù),當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)變化時(shí),客戶端也能實(shí)時(shí)顯示:


Paste_Image.png
Paste_Image.png

其中以下代碼是根據(jù)數(shù)據(jù)庫(kù)檢測(cè)到的變化的內(nèi)容觸發(fā)OnChange事件。
SqlDependency dependency = new SqlDependency(sqlCommand);
dependency.OnChange += new OnChangeEventHandler(dependency_Onchange);

9、建一個(gè)控制器:兩個(gè)Action操作


Paste_Image.png

10、視圖:


Paste_Image.png
Paste_Image.png
Paste_Image.png

到了,到此為止本教程基本結(jié)束了,下面將會(huì)是本教程的實(shí)際效果。

這是數(shù)據(jù)庫(kù)中這張表的數(shù)據(jù)


Paste_Image.png

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


Paste_Image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,692評(píng)論 4 61
  • 1 我們每個(gè)人都活在面具...
    順山先生閱讀 529評(píng)論 0 3
  • 在老劉家陽(yáng)臺(tái)沙發(fā)窩了一個(gè)下午,一直覺(jué)得老劉是個(gè)有思想但沒(méi)生活的人,看看今天他的小屋,客廳里沒(méi)有電視沙發(fā),簡(jiǎn)單的書架...
    冷暖自知芃芃閱讀 293評(píng)論 0 0

友情鏈接更多精彩內(nèi)容