2013年12月28日 星期六

在WPF中使用SignalR


假日,在等著接送家人的時間空檔,順便寫了一個最近工作上會用到的範例,不知是Windows Client端的技術用的人越來越少還是如何? WPF的使用情境似乎沒啥網友討論,所以範例寫完之後順便放上GitHub,如果有需要的朋友們可以參考。
 
大概的需求如下圖,基本上非常簡單,用WPF與WP8作為用戶端(WP8的範例我晚一點寫),存取以asp.net SignalR所寫的服務,底下先寫WPF的部份:
 

 
會寫這個,主要的原因是,我們公司有不少先前已經搭建好的ASP.NET WebSite(Web Services),這些個WebSite是以WebForm的方式開發的,而用戶端不僅僅只有browser,還有不少WPF/Windows應用程式。所以雖然打算用SignalR做訊息傳遞,但又不是現在大家比較常見的ASP.NET MVC Site(不過說真的, 其實MVC或WebForm根本沒差)。再加上Client端(consumer)又不是Web,而是WPF(和WP8),所以稍微寫個簡單例子整理一下,好讓公司的開發人員可以接手去做後續的部分。
 
先把寫好的範例放在這裡,有需要的朋友可以參考。
 
背後的需求很常見,過去我們有很多以WPF或是XAML(不管是Silverlight/WP8/Windows 8 App...etc)開發的Application,在沒有導入SignalR之前,如果需要知道伺服器端的狀態或訊息,要嘛就是走web services polling、要麼就是走socket,不然就是用push notification(但只有Windows Phone/Windows 8 App才能享用)。因此,傳統的Windows/WPF應用程式(不知道現在還有多少人在寫?),要透過http方式來接收伺服器端主動推送過來的訊息不是非常容易。(搞polling的效能當然是差到不行,又得自己做些手腳提高效能,挺費力)
 
但SingalR讓開發人員現在不用大腦就可以很輕鬆地解決這個問題。
 
所以我們打算在Windows/WPF/Silverlight應用程式當中快速地加入一些由伺服器端推送訊息到用戶端的功能,因此有了SignalR+WPF的這種需求,也因此有了這個範例。
 
範例中,是一個很簡單的聊天室,然後透過一個(其實你可以Run兩個instance比較好玩)WPF Client,搭配SingalR開發的Services,達成伺服器端與用戶端溝通的效果。
 
除此之外,特別用.aspx做了一個在WebForm中透過GlobalHost來主動傳送訊息到WPF Client端的例子,好讓我們的伺服器端可以主動推送訊息到用戶端。
 
時間的空檔到了,過一兩天有空我會再稍微仔細談談這個範例程式碼的部份。順便,下一個例子就是寫個WP8的用戶端了(我明後天補上)...
 
==========================================================
後記:開發技術的進步,讓原本需要耗費不少時間的功能,現在可以用等人的空檔花一兩個小時就完成 ~ 這很有趣,但也有些令人感慨(因為剛好前幾天聖誕夜分享中,又再次有學員問到,軟體開發技術的改變迅速,是否還值得再多花時間投入云云~ )。