[.NET] SignalR: 一個改變 Web 應用開發觀念的開發方式

  • 31614
  • 0
  • AJAX
  • 2012-07-02

SignalR 這個專案是 ASP.NET MVC 3.0 在開發的時候就建立的一個專案,由 David Fowler 與 Damian Edwards 兩位 ASP.NET 團隊成員所建置,它的主要功用是讓 Web Application 的用戶端和伺服器間的通訊能夠一致化,在 SignalR.net 網站內的介紹中,SignalR 的主要功能協助開發人員在 .NET 上建置出能夠支援即時通訊 (real-time) 且多使用者互動 (multi-user interactive) 的 Web 應用程式,因此它的標的不只是針對 ASP.NET MVC 本身,而是整個 .NET Framework 平台,它也不限 Hosting 的應用程式,這種筆者覺得它變成是 Web API 的另一種實作選擇,但是它在核心端處理連線的功能上比 ASP.NET MVC 的 Web API 要強多了,更重要的是,它可以在 Web Form 上使用。

SignalR 這個專案是 ASP.NET MVC 3.0 在開發的時候就建立的一個專案,由 David FowlerDamian Edwards 兩位 ASP.NET 團隊成員所建置,它的主要功用是讓 Web Application 的用戶端和伺服器間的通訊能夠一致化,在 SignalR.net  網站內的介紹中,SignalR 的主要功能協助開發人員在 .NET 上建置出能夠支援即時通訊 (real-time) 且多使用者互動 (multi-user interactive) 的 Web 應用程式,因此它的標的不只是針對 ASP.NET MVC 本身,而是整個 .NET Framework 平台,它也不限 Hosting 的應用程式,這種筆者覺得它變成是 Web API 的另一種實作選擇,但是它在核心端處理連線的功能上比 ASP.NET MVC 的 Web API 要強多了,更重要的是,它可以在 Web Form 上使用。

因為沒想到睡了一個午覺,簡介文就被寫走了 Orz,所以本文不打算講那些東西,可移駕到 91 的部落格:http://www.dotblogs.com.tw/hatelove/archive/2012/07/01/signalr-introduction-about-realtime-website.aspx

SignalR 想要解決的問題,是在開發人員想建置像 Facebook/Google+ 這種近乎即時通訊的網站時會遇到的困難,其中一種就是長時間的 JavaScript 輪詢,筆者之前有寫過一篇 Comet Programming 方法,那是其中一種解決方案,不過它還是需要開發人員直接介入管理連線行為,在 SignalR 內的用戶端函式庫 (.NET/JavaScript) 提供了自動管理的能力,開發人員只需要直接取用 SignalR 的 Client Library 即可,同時它的 JavaScript 函式庫可和 jQuery 完美整合,因此能直接與像 jQuery 或 Knockout.js 整合使用。

它的另外一個特性,就是想要試著將即時能力 (realtime) 帶到 Web Application 的開發中,這也是筆者為什麼說它會是一個改變 Web 應用開發觀念的原因,因為長久以來想要在 Web Application 做到即時能力是非常困難的,近兩年在 Comet Programming 模式以及像 Facebook 這樣的網站進入市場後,逐漸的拉近了 Web Application 與 realtime 間的距離,以前只能透過 Flash/Silverlight 才做得到的即時能力,現在己經可以由 JavaScript 獨力完成,SignalR 不但透過 JavaScript 將這個能力成功實作在 Web Client,它甚至還進一步將它實作在 .NET 的用戶端程式中,簡單的說,WPF 應用程式也可以用它和 Web 整合,Console 應用程式也可以。

SignalR 將上面所說的兩種能力以不同的物件區分:

  • Persistent Connection:持久型連線,用來解決長時間連線的能力,而且還可以由用戶端主動向伺服器要求資料,而伺服器端也不需要實作太多細節,只需要處理 PersistentConnection 內所提供的五個事件:OnConnected, OnReconnected, OnReceived, OnError 和 OnDisconnect 即可。
  • Hub:訊息交換器,用來解決 realtime 訊息交換的功能,伺服器端可以利用 URL 來註冊一個或多個 Hub,只要連線到這個 Hub,就能與所有的用戶端共享傳到伺服器上的訊息,同時伺服器端可以呼叫用戶端的指令碼,不過它背後還是不離 HTTP 的標準,所以它看起來神奇,但它並沒有那麼神奇,只是 JavaScript 更強,強到可以用像 eval() 或是動態解譯執行的方式,允許 JavaScript 能夠動態的載入與執行方法呼叫而己。

 

正如筆者在事件驅動的世界一文中的想法,SignalR 將整個交換資訊的行為封裝得非常漂亮,用戶端和伺服器全部都使用 JSON 來溝通,在伺服器端宣告的所有 hub 的資訊,都會一般化成 JavaScript 輸出到用戶端,.NET 則是依賴 Proxy 來產生代理物件,這點就和 WCF/.NET Remoting 十分類似,而 Proxy 的內部則是將 JSON 轉換成物件生成,以讓用戶端可以看到物件。

image

 

簡單的說,整個 SignalR 的資料交換都是依賴 JSON,所以可以相容於大多數的主流瀏覽器,然而較老的瀏覽器 (例如 IE6, IE7) 就沒辦法支援,可能要靠外部的 JSON Parser 來協助。

這篇並沒有程式碼,因為只是想要大概介紹一下 SignalR 這個 Framework,我們會慢慢的進入它的 Programming,也因為它的封裝程度很強,因此在拆解它的功能時會有很多不容易懂的程式碼,筆者雖然會先整理過,但是有可能還是不容易看懂,讀者要有一點心理準備 :)

 

Reference:

https://github.com/SignalR/SignalR/wiki