ASP.NET SignalR 2.0 入門指南

jopen 9年前發布 | 27K 次閱讀 ASP.NET .NET開發

介紹SignalR

ASP.NET SignalR 是一個為 ASP.NET 開發人員的庫,簡化了將實時 web 功能添加到應用程序的過程。實時Web功能使服務端代碼推送內容到鏈接可客服端并立即應用成為可能,而不需要服務端等待客戶端去請求數據。

SignalR可用于任何你想添加實時Web功能到ASP.NET應用程序的情形,聊天室是一個常用的例子,用戶可以刷新Web頁面來獲得新的數據,或者頁面使用一個長輪詢來取回數據,這都是SignalR可以應用的場景。比如說儀表盤和監視系統,實時游戲等。

SignalR支持以一種簡單的API來創建服務器到客戶端的遠程調用客戶端的Javascript方法,SignalR還包括用于用于連接管理的API和分組連接。

ASP.NET SignalR 2.0 入門指南

SignalR自動的處理連接管理,并允許你像一個聊天室那樣同時向所有連接的客戶端廣播消息,你也可以向特定的客戶端發送消息,在客戶端和服務器之間的連接是持久的,不需要像傳統的HTTP連接那樣重建每一個連接。

SignalR支持服務器推送功能,在服務器中可以調用在瀏覽器中的客戶端代碼,而不是像當今的“請求-響應”模式。

SignalR可以通過服務總線擴展到數以千計的客戶端,同時SignalR是開源的,可以用過Github訪問到。

SignalR和WebSocket

SignalR當WebSocket可用時優先使用新式的WebSocket傳輸,同時也兼容老式的傳輸。雖然你可以立刻使用WebSocket編 寫你的應用程序,但是使用SignalR意味著你可以獲得本來需要你自己去實現的很多擴展方法,最重要的是,你可以直接使用SignalR編寫利用 WebSocket的代碼,而不必擔心還要為舊的客戶端提供支持。同時你也不必擔心WebSocket的更新,因為SignalR會持續的更新來支持基礎 的傳輸協議,提供對不同版本的WebSocket的統一接口支持。

雖然你可以單獨使用WebSocket創建你的解決方案,但是SignalR支持所有你需要自己去編寫的方法,比如支持其他修訂版的功能。

傳輸和回滾

SignalR是對一些服務器和客戶端之間實時協作傳輸的抽象化,一個SignalR連接作為一個HTTP開始,但是如果WebSocket是可用 的將得到利用。WebSocket是SignalR理想的傳輸方法,它能高效的利用服務端存儲,擁有最少的延遲,而且擁有最基礎的功能(比如全雙工通 信),但是它也同時又嚴格的要求:WebSocket必須要求服務器使用Windows Server 2012或者windows 8,使用.NET Framework 4.5框架,如果沒有達到這些條件,SignalR將試圖使用其他的傳輸來創建連接。

HTML5 傳輸協議

這些傳輸依賴于對HTML5的支持,假如客戶端不支持HTML5標準,講使用老式的傳輸協議:

WebSocket:(如果客戶端可服務器端都支持WebSocket)。WebSocket是唯一一個建立客戶端和服務器端在真正的持久的雙工的 傳輸協議,但是同時WebSocket也擁有嚴格的要求,它只在最新版本的IE、chrome和FireFox得到支持,在像Opera和Safari這 些瀏覽器中得到的一部分的實現。

服務器發送事件:也稱為事件源。基本上除了IE以外都支持事件源。

Comet transports

以下的傳輸協議是基于Comet web應用程序模型的,在客戶端瀏覽器或者其他客戶端維持一個長期持久的HTTP請求,服務器端使用它推送數據而無需客戶端單獨請求。

持久型框架(Forever Frame):(僅限于IE)持久型框架創建一個隱藏的IFrame,用它來創建一個在服務器終結點不結束的請求,服務器端可以持續不斷的發送到客戶端執 行腳本,一次來支持一個單向的從服務器端到客戶端的實時連接。這個鏈接使用了與客戶端請求服務器端不同的連接,像一個標準的HTTP請求,為每個需要發送 的數據創建新的連接。

AJAX長輪詢(Ajax long polling),長輪詢不創建持久的連接,取而代之的是。直到服務器另一端有反饋,在向開放的服務器發送請求,此時需要馬上建立新的鏈接

傳輸協議選擇過程

下面列表顯示了SignalR選擇傳輸協議的過程:

1.如果瀏覽器是IE8或者更老的版本,使用長輪詢;

2.如果配置了JSONP(當連接開始的時候設置jsonp參數為true),使用長輪詢;

3.如果正在創建跨域的連接(如果SignalR終結點不和頁面上的地址相同),如果以下條件符合將使用WebSocket:

    • 客戶端支持CORS(了解詳細情況,請點擊這里
    • 客戶端支持WebSocket
    • 服務器端支持WebSocket

4.如果JSONP沒有被配置并且連接不是跨域的,如果客戶端和服務器端都支持WebSocket,將使用WebSocket;

5.假如客戶端和服務器端都不支持WebSocket,盡量使用事件源;

6.如果服務器端不支持事件源,使用持久型框架;

7.如果持久型框架也失敗,使用長輪詢。

監測傳輸

你可以決定是否在總線上打開日志記錄,打開瀏覽器的控制臺窗口。

要啟動你在瀏覽器的總線事件,請將以下命令添加到客戶端應用程序中:

在IE中,按F12打開開發人員工具,點擊“控制臺”標簽頁。

在Chrome中,使用組合鍵Ctrl+Shift+J打開控制臺

指定傳輸協議

協商傳輸協議需要一定的時間和服務器客戶端資源,如果客戶端可以預知到,那么傳輸協議可以在連接開始的時候指定,以下代碼通過一個簡短的示例開啟一個使用AJAX長輪詢的連接,如果它已知客戶端不支持其他任何的協議:

connection.start({ transport: 'longPolling' });

你也可以指定一個回調順序讓客戶端去嘗試指定傳輸協議:

connection.start({ transport: ['webSockets','longPolling'] });

以下是定義的用于指定傳輸協議的字符串:

  • webSockets
  • foreverFrame
  • serverSentEvents
  • longPolling

連接和總線

SignalR API包含兩種服務器端和客戶端的通信模型:持久連接和總線.

一個連接表示單個收件人、編組或者廣播消息發送一個簡單的終結點。持久化連接API賦予程序員直接訪問SignalR提供的底層通信協議的能力,使用連接通信模型類似于程序員使用像WCF那樣基于連接的API。

總線是更高級別的管道,他是建立在基于連接的API上,允許客戶端和服務器彼此直接調用方法。SignalR神奇的處理在跨越機器的調度,讓客戶端 調用服務器端代碼像調用本地方法那樣簡單,反之亦然。使用總線通信模型類似于使用.NET Remoting這樣的遠程調用API,使用總線模型允許你將強類型的參數傳給方法,進行模型綁定。

體系結構關系圖

以下關系圖表示了總線、持久化連接和用于傳輸的基本技術間的關系:

ASP.NET SignalR 2.0 入門指南

來源:小白哥哥

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!