Silverlight WCF 初尝小结
一年多的時間一直在等待Silverlight的穩定版本,但是從1.0 2.0 到現在的3.0BETA 一直吸引著我,于是終于按奈不住,一窺了Silverlight的魅力。
?
Silverlight是什么?怎么說呢?也許開發過WPF的人會有比較透徹的理解。Silverlight就像WPF提煉出來運用到WEB上的插件。界面的開發,程序部分的開發都集成了WPF的那一套,不過,既然是應用到WEB上的,自然遵循了很多WEB的規則,因此也有些許區別于WPF,至少他們概念上就完全是兩個東西,這樣的比較就類似于WINFORM和 ACTIVEX。
?
Silverlight可以像FLASH一樣做出炫目的客戶端效果,同時擁有完善的開發構架,程序員可以非常方便的處理Silverlight中的事件、調用系統庫,這是FLASH無法比擬的,當然FLASH相對Silverlight來說,動畫和矢量的設計也許會更加得心應手。
?
對于客戶端而言,Silverlight與FLASH基本上一樣,用戶都需要在瀏覽器上安裝相應插件(Silverlight的插件小很多),展現出來同樣的有視覺沖擊力。所以對用戶而言,處了安裝的插件不同以外,其他似乎不存在什么太大的差異,這也是MS目的,只要用戶不認為兩者有什么區別甚至Silverlight更好,那么,對開發人員的方便就是對MS的方便。
?
廢話多了。
?
如何搭建Silverlight的開發環境呢 ?
網上很多相關文章,給人的第一影響就是“麻煩”。沒錯,很麻煩,不像FLASH,安裝一個FLASH軟件就可以進行開發。
Silverlight,需要很多部件支持。
? 首先以目前的正式版本2.0來說,就需要VS2008 + SP1 ,VS的作用當然是做程序部分的開發,毋庸置疑,而且WEB的開發也用到它,所以先安裝個VS2008+SP1沒什么意見吧。
? 之后,你會發現你的VS2008并不能創建 Silverlight應用程序項目,為什么,因為你缺少 Silverlight Tool FOR VS2008 SP1 ,所以還要安裝一個 Silverlight Tool for VS2008 SP1。
? 好了,可以在VS里創建Silverlight項目了,可以進行開發了,VS支持界面預覽,但是不可編輯。而且用VS開發界面似乎不太現實,不用擔心,MS當然也有它自己的界面開發工具? BLEND2 +SP1 ,BLEND里的示例是WPF的,所以可以知道,BLEND是開發WPF界面的,當然用來開發Silverlight的界面也是小菜一碟。 VS08可以和BLEND2相互切換來完成界面和程序的開發。
??? 至此,就可以完成Silverlight的開發環境配置,配置好以后,.NET3.0 3.5會被默認的安裝,這是需要注意的,因為開發過程中可能會用到3.0? 3.5的庫,因此如果將項目發布到服務器后,也應當相應的將.NET的這些版本安裝到服務器上。
?
?
好了,創建個Silverlight來玩玩吧。
?
創建Silverlight應用程序項目的時候,VS會問你 是調試的時候生成測試頁來承載Silverlight還是自動創建個ASP.NET項目來承載Silverlight, 有什么區別呢 ?如果你只是做Silverlight的界面和客戶端的交互效果,用單獨的測試頁來承載就可以了,這樣方便調試,按個CTRL+F5就OK,但是如果你要用到WCF,或者通過ASP.NET做些動態的事情,那么就用ASP.NET項目來承載吧,這樣可以盡可能的模擬出將Silverlight承載到網站后的效果。
?
?
創建Silverlight后,你可以看到項目里有兩個XAML文件并相應的對應了.CS文件, 一個是APP.XAML另一個是Page.XAML,APP.XAML.CS的構造函數是初始化Silverlight項目的,接下來?
private void Application_Startup(object sender, StartupEventArgs e)
??????? {
??????????? this.RootVisual = new page();
??????? }
可以看到 new 后面的就是Page.xaml.cs所在的類。他的意思當然就是創建Page示例,這樣你的Page就被實例化出來了,很像WINFORM吧。
?
?
之后的事情,個人認為開發過.NET的人應該都駕輕就熟了。需要注意的是,跟開發ASP.NET不同,? Silverlight的所有代碼是在客戶端運行的,對于很多開發慣了ASP.NET的人來說可能一下子不習慣,不過如果你是做WINFORM的,那就當我沒說。
?
試著寫一個小程序來玩玩吧。
?
東西做好了,當然那就需要編譯。Silverlight在生成后會在BIN下生成一個APPMAINFEST.XAML,這是一些配置比如DLL的路徑,一個DLL,不用說了,邏輯代碼都在這。另外會有一個XAP,這是什么,其實就是剛才說的那兩個文件的一個壓縮包,可以ZIP RAR工具打開,他只是將后綴作為XAP,這樣在頁面上<object>調用的時候SOURCE就會指向XAP這個包。
?
就這么簡單,在WEB上用<object>承載這個生成出來的XAP包就可以顯示Silverlight了。
?
似乎太沒什么含量,感覺不出Silverlight的魅力。
那么就嘗試做個應用了WCF的Silverlight吧。
?
WCF是什么?根據我了解的資料,WCF是一個統一的類似WEBSERVICE的解決方案,WEBSERVICE是WCF的一個子集。
他提供了更多更強的服務方案。
?
具體資料可以在MSDN上找到,廢話不多說了。
?
引用WCF等過程與以前引用WEBSERIVCE差不多,摸索下很快就了解了。
這里提一下需要注意的地方。
?
在引用 WCF后,Silverlight項目里會生成一個ClientConfig文件,如果WCF項目是單獨的,這個ClientConfig文件里不會寫入任何東西,你只會看見一個配置跟節點。
但是如果你的WCF是創建在某個ASP.NET項目里,這時候生成出來的ClientConfig文件里會有很多配置,例如綁定方式和服務ENDPOINT(服務提供的地址)。
?
?
以上綠色文字的地方是我之前的理解錯誤,ServiceReferences.ClientConfig內是否自動生成配置信息是要看Silverlight引用的WCF是否啟用了Silverlight功能,而不是看WCF是單獨的項目還是在Web項目中的其中一項。所以在當我們在在項目中創建一個“啟用Silverlight功能的WCF”后,在Silverlight項目中引用它時,ServiceReferences.ClientConfig文件就會自動配置出該引用的終節點和綁定。
?
?
實際上引用WCF之后,項目里只是創建了一個WCF所提供服務的類的結構,至于如何去綁定,去哪里請求服務,都是由配置的Binding方式和ENDPOINTADDRESS來決定。
?
為什么引用一個單獨的WCF項目時不生成配置呢?因為在編碼過程中,程序員可以制定BIND和ENDPOINT,所以,個人認為MS是為了讓你的應用程序更加靈活,所以直接引用獨立的WCF項目是不會生成CLIENTCONFIG的配置的,然而,如果你的WCF服務是來自一個ASP.NET項目的話,那么Silverlight項目會認為你將會把Silverlight承載到這個ASP.NET中的某頁去,因此就將BIND和ENDPOINT直接配置到了CLIENTCONFIG中。當然,及時配置到了CLIENTCONFIG,在編碼中仍然可以指定BIND和ENDPOINT來覆蓋CLIENTCONFIG中的配置。
?
Silverlight在調用WCF服務是通過異步調用,因此代碼類似這樣:
?
private void UserControl_Loaded(object sender, RoutedEventArgs e)
??? {
??????? Binding binding = new BasicHttpBinding();
??????? EndpointAddress endPoint = new EndpointAddress(
??????????????? "http://localhost:52424/Blog.svc");
??????? BlogClient client = new BlogClient(binding, endPoint);
??????? client.GetPostsCompleted += new EventHandler<GetPostsCompletedEventArgs>(client_GetPostsCompleted);
??????? client.GetPostsAsync();
??? }
??? void client_GetPostsCompleted(object sender, GetPostsCompletedEventArgs e)
??? {
??????? if (e.Error == null)
??????? {
??????????? Posts.ItemsSource = e.Result;
??????? }
??? }
?
可以看到,當你在WCF創建了一個類,調用的時候,該類會被命名成[類名]+Client,所以,看到別人調用的時候有個XXCLIENT,不要奇怪為什么上下文找不到其定義。
?
之后,類中的方法也會成為 方法+ASYNC? 這是異步方法,在Silverlight中引用WCF就會出現,而在ASP.NET項目中引用則沒有。
?
?WCF被Silverlight引用后,會生成一個事件,對應方法? 方法名+Compeleted,在事件上綁定好處理函數,就完成了異步調用并異步返回了。
?
很簡單吧,比起AJAX來說,實在是方便很多。
?
注意看的朋友會發現 這里定義了個 Binding 類型的binding實例,和一個EndpointAddress 類型的endPoint,這就是之前我提到可以在編碼中手工指定 bind方法和Endpoint的地方,如果 ClientConfig里配置好了這兩個參數,你也可以這樣寫
?
private void UserControl_Loaded(object sender, RoutedEventArgs e)
??? {
??????? BlogClient client = new BlogClient();
??????? client.GetPostsCompleted += new EventHandler<GetPostsCompletedEventArgs>(client_GetPostsCompleted);
??????? client.GetPostsAsync();
??? }
?
?
當然,及時ClientConfig里配置好了,也可以通過編碼的時候指定來更改這兩個參數。
?
?
如果完全理解了Silverlight+WCF怎么做,我想你可以輕松的完成一個小示例來享受下Silverlight的魅力。
?
但是可能大多數人在做Silverlight+WCF的時候會遇到一些郁悶的問題,典型的就是跨域訪問的問題。
?
WCF比 WS考慮得要周全些了,為了禁止外部的非法調用,WCF默認只能是同域才可訪問,我們在開發的時候,如果WCF是單獨的項目,那么調試時,WCF的路徑可能是 http://localhost:1234/test.svc。而用來承載Silverlight的ASP.NET路徑則可能是 http://localhost:4321/xx.aspx?,這樣是會被認為是兩個不同的域,因此你的Silverlight將會出現跨域訪問的報錯,如果解決呢?沒什么特的,部署好,或是將兩個項目都生成好之后部署到IIS里,或是將 WCF項目移植到 ASP.NET項目中。?
?
OK!
基本上來說,Silverlight以及 Silverlight+WCF的開發解決方案就如此了。
?
有什么新的信息下次補充。
轉載于:https://www.cnblogs.com/ZetaChow/archive/2009/04/24/2237354.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Silverlight WCF 初尝小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今天被编码搞惨了,页面和脚本的编码一致性
- 下一篇: 还呗必须要有信用卡吗