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