2013年2月23日 星期六

SignalR 初體驗

最近有個需求,就是研究類似 facebook, plurk 等即時更新 client 畫面的技術,
技術細節可以 google "long-polling" 就會有需多相關文章,
也剛好,去年七月左右 Microsoft 推出了 SignalR ,當時只是覺得這功能超炫的,
但是沒有馬上動手試看看,直到最近開始找相關的文章,
覺得一定要動手嘗試看看,而且大大都把範例程式都給貼上來了,
所以馬上來測試。

不過立刻就碰到問題了,當時版本和現在版本差一半吧(0.5?和1.0)
連 namespace 都不一樣了,不過我想應該小小的修改一下就可以了吧。
原始程式範例請至黑暗執行緒大大的網站觀賞,以下僅列出需要修改的地方。

SignalRClient 專案的部分以 NuGet 安裝 Microsoft.AspNet.SignalR.Client
指令為 Install-Package Microsoft.AspNet.SignalR.Client
console 專案安裝 Microsoft.AspNet.SignalR 前後差異


需要 using 的  namespace
程式的部分
//須將
IHubProxy commHub = connection.CreateProxy("CommHub");
//改為
IHubProxy commHub = connection.CreateHubProxy("commHub");


接著是 web 專案,建立一個 asp.net mvc 4 的空白專案

安裝 Microsoft.AspNet.SignalR
指令為 Install-Package Microsoft.AspNet.SignalR
還要安裝 WebActivator
在 App_Start 加入 class RegisterHubs 內容如下(用來產生 signalr/hubs 的):

接著在 Controller 和 Model 中的 code 要修改的就是 namespace 和 Client 取得的方法,
// 原本的
context.Clients.ShowMessage(msg);
// 修改後的
context.Clients.All.ShowMessage(msg);
// 原本的
context.Clients[cid].ShowMessage(msg);
// 修改後的
context.Clients.Client(cid).ShowMessage(msg);

接著在 view 中需要修改的部分是 hub 呼叫 server/client 方法有更動
// 原本的
commHub.RefreshStats = function(dict) {
// 修改後的,呼叫 client 的 RefreshStats
commHub.client.RefreshStats = function (dict) {
// 原本的
commHub.register("Console");
// 修改後的,呼叫 server 的 register
commHub.server.register('Console');


到此修改完畢,可以好好地玩玩看 web 遠端遙控 console 的 client 了。
最後就可以得到,下面這樣的成果。