李燕
摘要:傳統(tǒng)Web網(wǎng)站中客戶端獲取服務(wù)器數(shù)據(jù)只能刷新頁(yè)面或使用Ajax輪詢才能實(shí)現(xiàn)實(shí)時(shí)顯示數(shù)據(jù),微軟開(kāi)發(fā)的SignalR服務(wù)端可主動(dòng)向客戶端推送數(shù)據(jù),實(shí)現(xiàn)了客戶端與服務(wù)器實(shí)時(shí)數(shù)據(jù)通信。該文介紹了SiganlR技術(shù)及在Web網(wǎng)站中的應(yīng)用。
關(guān)鍵詞:實(shí)時(shí)通信;實(shí)時(shí)Web功能;數(shù)據(jù)總線;SignalR
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)24-0062-02
1 概述
在網(wǎng)站開(kāi)發(fā)中經(jīng)常需要實(shí)現(xiàn)實(shí)時(shí)Web功能,即當(dāng)所連接的客戶端變得可用時(shí)服務(wù)器代碼可立即向其推送內(nèi)容,而不是讓服務(wù)器等待客戶端請(qǐng)求新的數(shù)據(jù)。在以前的Web網(wǎng)站技術(shù)中,客戶端要獲取服務(wù)器數(shù)據(jù)需通過(guò)不停地發(fā)送請(qǐng)求來(lái)輪詢服務(wù)端數(shù)據(jù)。這種發(fā)送Ajax請(qǐng)求給服務(wù)器的方式,在用戶量很大的情況下給服務(wù)器帶來(lái)很大的壓力,而定時(shí)刷新很多時(shí)候滿足不了對(duì)實(shí)時(shí)性要求較高的需求,比如聊天室應(yīng)用,管制現(xiàn)場(chǎng)流控信息傳遞等,都要求實(shí)時(shí)更新。ASP.NET SignalR是這一問(wèn)題比較好的解決方案。
2 SignalR概述
SignalR是微軟對(duì)Web開(kāi)發(fā)技術(shù)棧的擴(kuò)充,是一種可用來(lái)簡(jiǎn)化交互式實(shí)時(shí)多用戶Web應(yīng)用程序開(kāi)發(fā)的框架,利用SignalR,可以真正實(shí)現(xiàn)了Web客戶端和服務(wù)器之間雙向通信。服務(wù)器可以將內(nèi)容推送到已連接的客戶端。
SignalR提供一個(gè)簡(jiǎn)單的API用于創(chuàng)建服務(wù)器端到客戶端的遠(yuǎn)程過(guò)程調(diào)用,以便從服務(wù)器端.Net代碼中調(diào)用客戶端瀏覽器中的JavaScript函數(shù)。SignalR還包括用于管理連接(例如連接和斷開(kāi)連接事件)和為連接分組的API。SignalR會(huì)自動(dòng)管理連接,允許向所有連接的客戶端同時(shí)發(fā)送消息,也可以向特定客戶端發(fā)送消息。客戶端和服務(wù)端的連接是持久性的,不像傳統(tǒng)的HTTP連接——每次通信都需要重新建立一個(gè)連接。
SignalR是對(duì)一組在構(gòu)建客戶端和服務(wù)器之間的real-time功能所需要使用的傳輸技術(shù)的抽象。SignalR連接首先以HTTP發(fā)起請(qǐng)求,然后如果WebSocket可用的話,則升級(jí)到WebSocket連接。WebSocket是SignalR的理想傳輸方式,因?yàn)樗軌蚋咝У氖褂梅?wù)器的內(nèi)存、有最低的延遲,而且有最主要的功能(客戶端和服務(wù)器之間的全雙工通信),但它也有最嚴(yán)格的環(huán)境要求:WebSocket要求服務(wù)器是Windows Server2012或Windows8以及.NET Framework4.5。如果不滿足這些要求,SignalR將嘗試使用其他傳輸方式來(lái)建立連接??傊?,SignalR以一種相對(duì)于開(kāi)發(fā)者透明的方式確定服務(wù)器和客戶端之間最佳的通信技術(shù)方案(長(zhǎng)輪詢、forever frame、Server-Sent Events、WebSocket),然后使用這種技術(shù)創(chuàng)建一條底層的連接并保持該連接的永久開(kāi)放,并對(duì)連接的斷開(kāi)和重連接進(jìn)行自動(dòng)管理,如圖1所示:
SignalR在用來(lái)保持和服務(wù)器連接的傳輸層之上還存在著兩個(gè)不同的抽象層,它們構(gòu)成了使用所建立虛擬連接的兩個(gè)API或兩套規(guī)則。其中一個(gè)被稱作持久連接(Persistent Connection),這是一個(gè)較低的層,因此離真實(shí)的連接較近,提供了一個(gè)非常類(lèi)似套接字編程的開(kāi)發(fā)API。第二個(gè)抽象層基于一個(gè)稱為Hub的組件,是一個(gè)建立于連接API的高級(jí)管道?;贘avascript的靈活性和C#的動(dòng)態(tài)特性,Hub消弭了客戶端和服務(wù)器這兩個(gè)獨(dú)立物理環(huán)境之間的界限,它使得客戶端調(diào)用服務(wù)端的方法簡(jiǎn)單得猶如調(diào)用本地方法一樣,反之亦然。使用Hub還可以將強(qiáng)類(lèi)型參數(shù)傳遞給方法,并且可用綁定模型。這兩個(gè)抽象層之間的關(guān)系如圖2所示:
SignalR允許我們透明地在客戶端和服務(wù)器之間直接進(jìn)行方法調(diào)用,是如何做到的呢?這并沒(méi)有什么神奇之處,為了實(shí)現(xiàn)這樣的功能,SignalR將借助服務(wù)器Hub類(lèi)在客戶端自動(dòng)創(chuàng)建代理對(duì)象,并在它們的方法中輸入對(duì)它們實(shí)際方法的遠(yuǎn)程調(diào)用。相反,當(dāng)服務(wù)器調(diào)用客戶端某個(gè)方法時(shí),它將被一個(gè)在服務(wù)端“打包”這些調(diào)用的動(dòng)態(tài)類(lèi)型的特殊協(xié)議所解析,并使用底層傳輸通過(guò)推送(push)將它們發(fā)送到其它端點(diǎn)。然后它們將到達(dá)客戶端,并在這里進(jìn)行解析和執(zhí)行。過(guò)程如下圖所示:
4 結(jié)束語(yǔ)
SignalR是實(shí)現(xiàn)實(shí)時(shí)通信功能的有效解決方案,利用SignalR可以創(chuàng)建對(duì)消息實(shí)時(shí)性要求比較高的應(yīng)用,如在線協(xié)作工具、多用戶游戲、實(shí)時(shí)信息服務(wù)等。在Web應(yīng)用方面,如果有通過(guò)刷新頁(yè)面來(lái)查看數(shù)據(jù)或者是通過(guò)頁(yè)面實(shí)現(xiàn)長(zhǎng)輪詢來(lái)檢索數(shù)據(jù)等需求,那么就可以考慮使用SiganlR了。
參考文獻(xiàn):
[1] Patrick Fletcher. [EB/OL]http://www.asp.net/signalr/overview[E B/OL].
[2] 張占嶺.SignalR實(shí)現(xiàn)服務(wù)器與客戶端的實(shí)時(shí)通信[Z].