一段時(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ù)。
四、基本流程圖:

五、示例:
以下教程我會(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.
如圖:

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

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

4、設(shè)置webconfig。建立一個(gè)類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類了:

記得使用小駝峰命名,不然客戶端調(diào)用不了。
8、實(shí)現(xiàn)去數(shù)據(jù)庫(kù)獲取數(shù)據(jù),當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)變化時(shí),客戶端也能實(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)所有連接的客戶端的值也跟著改變了,這樣實(shí)時(shí)推送的功能也就實(shí)現(xiàn)了。
好了,關(guān)于SignalR的相關(guān)內(nèi)容就介紹那么多了,更多SignalR的技術(shù)內(nèi)容大家也可以自行挖掘一下。