摘 要: WCF服務與Silverlight技術相結合,為高效開發(fā)RIA應用提供了新的途徑。針對WCF服務技術在基于Silverlight的Web應用開發(fā)中所面臨的問題,對WCF服務的Silverlight客戶端調用、WCF服務繼承機制的實現以及異步調用機制的同步化等關鍵技術進行研究,提出了相關的優(yōu)化策略和實現方法,為基于WCF服務與Silverlight技術高效開發(fā)Web應用奠定了基礎。
關鍵詞: WCF; Silverlight; RIA; 服務調用
WCF(Windows Communication Foundation)是微軟提出的一個面向服務的分布式分層架構,它整合了.Net平臺下所有與分布式系統(tǒng)有關的技術,為開發(fā)各種不同環(huán)境下的分布式系統(tǒng)提供了一個統(tǒng)一、高效的方法。Silverlight(銀光)是微軟全力打造的一個開發(fā)面向富互聯網應用程序(RIA)的基礎平臺,它改變了傳統(tǒng)Web應用程序界面設計方式,能夠開發(fā)出具有專業(yè)圖形、音頻和視頻的Web應用程序,增強了用戶體驗。因此WCF服務與Silverlight技術的有機結合,為高效開發(fā)RIA應用提供了一種新的途徑[1]。但WCF服務技術與Silverlight技術是兩種不同的技術體系,在開發(fā)基于Silverlight的Web應用時,常規(guī)的WCF服務技術不能完全適應開發(fā)的要求,因此必須對其進行優(yōu)化。本文針對WCF服務技術在基于Silverlight的Web應用開發(fā)中所面臨的問題,對WCF服務的Silverlight客戶端調用、WCF服務繼承機制的實現以及異步調用機制的同步化等關鍵技術進行研究,提出了相關的優(yōu)化策略和實現方法。
1 Silverlight和WCF簡介
1.1 WCF技術簡介
WCF是微軟基于SOA(Service Oriented Archit -ecture)推出的.Net平臺下的框架產品,它代表了軟件架構設計與開發(fā)的一種發(fā)展方向,在微軟的戰(zhàn)略計劃中也占有非常重要的地位。WCF是使用托管代碼建立和運行面向服務(Service Oriented)應用程序的統(tǒng)一框架,它使得開發(fā)者能夠建立一個跨平臺的安全、可信賴、事務性的解決方案,且能與已有系統(tǒng)兼容協作。WCF是微軟分布式應用程序開發(fā)的集大成者,它整合了.Net平臺下所有與分布式系統(tǒng)有關的技術,例如.Net Remoting、ASMX、WSE和MSMQ,功能十分強大。
WCF的整體基礎框架包括服務端框架和客戶端框架兩個部分[2]:服務端框架主要將服務以終結點的形式暴露出來供潛在的用戶端消費,并且接收處理客戶端服務請求、激活服務對象、執(zhí)行相應的操作并返回最終結果;客戶端架構顯得相對簡單,主要是通過服務代理完成服務請求和結果接收。二者的核心都是圍繞服務契約(ServiceContract)進行的。
一個完整的WCF服務的應用實例包括服務契約的定義、服務的實現、服務的寄宿、元數據的發(fā)布和導入、服務代理的創(chuàng)建和服務調用等步驟。
1.2 Silverlight技術簡介
Microsoft Silverlight 是一種跨瀏覽器、跨平臺的.NET Framework 實現,用于為 Web 生成和提供下一代媒體體驗和富互聯網應用程序(RIA)。Silverlight 統(tǒng)一了服務器、Web 和桌面的功能,統(tǒng)一了托管代碼和動態(tài)語言、聲明性編程和傳統(tǒng)編程以及 Windows Presentation Foundation (WPF) 的功能[3]。
傳統(tǒng)的Web 應用程序在瀏覽器中以HTML方式呈現界面,在Web 服務器端實現呈現邏輯控制和客戶端狀態(tài)維持,造成界面頻繁刷新、狀態(tài)維持困難、HTML 難以表達眾多媒體元素等問題。而實現RIA應用的Silverlight 技術,使用XAML 語言描述多媒體界面,在客戶端實現呈現邏輯,通過網絡與分布在Internet 中的Web 服務進行通信,獲取數據資源[4]。
Silverlight能夠開發(fā)出具有專業(yè)圖形、音頻和視頻的Web應用程序,增強了用戶體驗。Silverlight相當于一個小型的.NET Framework,可以充分調用客戶端機器的處理運算能力,使得Web頁面展示如同C/S端程序一般,并且實現了無刷新,帶來了更多的用戶視覺與操作體驗。
2 基于Silverlight與WCF的Web應用開發(fā)框架
傳統(tǒng)的Web應用開發(fā)一般采用典型的三層架構,主要包括數據訪問層、業(yè)務邏輯層和表現層[5]。
數據訪問層實現與數據庫的交互即對數據庫數據增、刪、改、查等操作。在一定程度上驗證數據的有效性和正確性,但無法確定數據作用,不負擔任何業(yè)務邏輯。
業(yè)務邏輯層實現相應業(yè)務邏輯數據的轉換處理以及生成。對流入數據的有效性和正確性進行驗證,并轉換成相應的流出數據,以達到業(yè)務邏輯目標。
表現層實現用戶與系統(tǒng)的交互,直接驗證數據的有效性和正確性。它接收用戶請求并返回響應數據結果的展現,而具體的數據處理則轉到業(yè)務邏輯層和數據訪問層進行處理。
WCF服務技術與Silverlight技術的出現,為開發(fā)高擴展性、豐富用戶交互方式的Web應用提供了更高效的方法。其中WCF 技術提供了多種高效且高可用的企業(yè)級特性,可以把傳統(tǒng)的、獨立的技術整合到一起,提供了對可靠性、事務性、并發(fā)管理、安全性以及實例激活等技術的有力支持,同時提供了簡單、快捷的遠程服務訪問方式。通過WCF技術可有效提高應用系統(tǒng)的兼容性和擴展性,并降低系統(tǒng)內部模塊的耦合度。Silverlight技術是面向RIA的客戶端,為開發(fā)豐富用戶交互方式的Web應用提供了支撐。因此二者的結合能夠完全發(fā)揮各自的技術優(yōu)勢,完全符合RIA的技術要求。為此,本文針對WCF服務技術以及Silverlight技術的特點,通過擴展傳統(tǒng)的三層Web應用開發(fā)框架,提出了基于Silverlight與WCF的Web應用開發(fā)框架,如圖1所示。
在此框架中,核心是服務層和用戶控件層。其中服務層通過WCF服務的方式對業(yè)務邏輯層對象進行封裝,并為外部(表現層)提供了標準的接口;表現層通過標準的通信方式調用WCF服務以實現對業(yè)務邏輯對象的訪問。服務層的存在,降低了系統(tǒng)的耦合度,提高了系統(tǒng)的擴展性,并通過WCF服務的方式提高了系統(tǒng)的應用性能。
用戶控件層直接支撐表現層,在Silverlight客戶端環(huán)境下,為表現層的開發(fā)提供了各種Silverlight控件支持。在Web應用客戶端開發(fā)中,只需對一些控件進行組合擴展,便可開發(fā)出各種滿足表現層頁面,展示需求用戶界面;通過調用服務層的WCF服務,以實現對各種業(yè)務邏輯對象的訪問。通過用戶控件層可大大提高用戶界面的開發(fā)效率。
另外,在Web應用開發(fā)中,可根據實際提取出一些通用方法和數據對象實體,封裝為通用類庫和業(yè)務數據實體類,分別作為系統(tǒng)開發(fā)的輔助工具類庫和全局共享的數據類,以提高系統(tǒng)的開發(fā)效率。
3 面向Silverlight的WCF服務優(yōu)化
Silverlight技術與WCF服務的結合符合當前Web應用的開發(fā)趨勢,但在面向Silverlight的Web應用開發(fā)環(huán)境下,通用的WCF調用方法、異步/同步調用機制以及WCF服務繼承機制不能完全適應系統(tǒng)的開發(fā)要求,因此針對Silverlight對WCF服務進行優(yōu)化,成為基于Silverlight技術與WCF服務技術開發(fā)Web應用的關鍵。
3.1 Silverlight客戶端調用WCF服務的設計實現
在WCF服務框架下,服務器端的服務不管客戶端服務代理的調用方式(同步或者異步),其設計與實現始終是一致的。在客戶端,WCF通過客戶端創(chuàng)建代理進行服務的調用,服務代理對象的創(chuàng)建有兩種方式[2]:
一種是代理構造法,即借助相關工具導入服務元數據生成代理類。.NET環(huán)境下,面向Silverlight客戶端提供的一種通用方法(“添加服務引用”)就是這種方法。此種方法實現簡單,但是由于服務代理是由統(tǒng)一的工具生成,生成規(guī)則有限,一旦應用系統(tǒng)客戶端代理需要統(tǒng)一地實現或更改,如服務契約的繼承機制層級關系的恢復,就需要對每個服務代理進行手工修改,尤其對于一次產生多個服務代理對象應用的情形,這種方式效率較低且難以形成調用機制的一致化。
另一種方法是通道工廠法,即直接使用通道工廠(ChannelFactory<T>)來調用服務操作。通道工廠法相對來說具有更好的靈活性和擴展性,更適合于系統(tǒng)應用的底層。但是,這種方式需要客戶端共享服務契約接口的定義,一般情況下直接共享服務契約,客戶端需同步調用服務操作,而Silverlight客戶端不支持同步數據操作,只支持異步數據操作,因此在Silverlight客戶端需要生成異步方式服務契約代理類。
為解決上述問題,本文提出采用通道工廠法靈活創(chuàng)建面向Silverlight的WCF服務的統(tǒng)一異步機制客戶端代理。創(chuàng)建如圖2所示流程:首先發(fā)出服務操作調用請求,根據其服務類型確定服務地址即WCF服務的終結點,進而判斷是否已生成相應異步方式服務契約代理類,如果沒有,則先生成相應的服務代理類,然后再直接創(chuàng)建相應的通道工廠實例調用服務異步執(zhí)行相關操作,最后返回操作結果。
根據上述客戶端服務調用流程,在客戶端保留了與服務器端共享一致的服務契約代碼,暴露相關服務契約類型和操作,以便客戶端潛在地調用,同時設計和實現了如圖3所示的客戶端服務調用框架:通過ServiceCallBuilder<TService>解析服務操作請求得到相應的服務地址和調用服務的方法和參數,然后根據其服務地址和類型調用ServiceChannelFactory<TService>生成相應的異步方式服務契約代理類,進而創(chuàng)建相應的異步信道工廠的服務信道,最后結合ServiceCallBuilder<TService>解析的服務方法和參數,在ServiceCall<TService>中完成服務操作的異步調用。
AsyncServiceInterfaceFactory和AsyncServiceInterface Generator是對Silverlight客戶端異步方式服務契約代理類自定義生成的實現。通過應用Silverlight客戶端WCF代理自動生成程序集文件(Silverlight.WCF.AutoGeneratedAsyncInterface.dll)采用反射機制,利用AsyncServiceInterfaceFactory類加載WCF服務契約類型和Silverlight客戶端WCF代理自動生成程序集文件,然后調用AsyncServiceInterfaceGenerator中的自定義的Generate方法生成異步服務契約代理類型和該類型中異步操作的方法,并返回創(chuàng)建的異步服務契約代理類型,為客戶端調用提供接口。
以這種方式實現客戶端代理服務的異步方式的可控生成,顯然比代理構造法的工具生成服務契約代理類具有更好的靈活性和擴展性。
3.2 WCF服務繼承機制的實現
面向對象的設計原則對于WCF服務設計來說在系統(tǒng)開發(fā)中有著重要的借鑒價值和實際價值,尤其是WCF服務的繼承機制的實現對于提高系統(tǒng)的開發(fā)效率有著重要的作用。雖然服務契約的定義與接口定義類似,但由于WCF框架自身的限制,WCF契約屬性是不支持繼承的[6]。
在服務器端契約繼承關系上,利用.NET環(huán)境本身對接口繼承的支持,只需要在多層服務契約接口定義時,在每層接口上標記其相應的服務契約屬性(ServiceContract),以支持WCF服務契約屬性。
然而,代理構造法生成的客戶端服務代理的創(chuàng)建一般無法還原服務端契約的層級關系,這必須通過手工修改代理并導入服務契約的定義,恢復契約層級。實際系統(tǒng)開發(fā)中這種手工恢復的方式大大增加了工作量和復雜度。而采用3.1節(jié)中所提出的方法生成的Silverlight客戶端服務代理,可以很方便地完成繼承機制的統(tǒng)一實現。
由于客戶端對WCF服務的調用并不會影響服務器端,一個WCF服務的客戶端代理只需要有其所繼承的上層基類的操作契約,維持相應操作契約的特有屬性,則不需要恢復層級關系就可以實現對服務端上層基類操作的調用。為此,本文設計創(chuàng)建BaseServiceInterface類在客戶端啟動時結合與服務器端共享的服務契約代碼,注冊所有基類。對于一個WCF服務,可利用3.1節(jié)所提到的客戶端異步方式服務契約代理類的生成類AsyncServiceInterfaceGenerator中的Generate方法所調用的自定義方法(GetOperationContra -ctMethods),判斷是否屬于相應基類的派生類,并生成所屬基類和自身服務契約所有操作異步方法及操作契約屬性。這樣就完全統(tǒng)一實現了客戶端服務代理的繼承機制。
3.3 異步調用機制的同步化
Silverlight客戶端是通過異步方式來調用WCF服務的,但是對于一些應用又需要采用同步的方式來調用服務,如一些嚴格要求業(yè)務流程的應用系統(tǒng)。為此,本設計采用C#迭代器,實現了異步調用機制的同步化,來滿足同步調用服務的應用開發(fā)需求。
C#迭代器可以返回相同類型的有序代碼塊,通過這些代碼塊能夠實現特定的處理功能。迭代器代碼塊與普通代碼塊類似,只是迭代器代碼塊中存在不定量的yield語句。其中,yield return語句生成迭代下一個值;yield break語句設置迭代終止完成。即關鍵字yield用于設置返回值,當程序達到y(tǒng)ield return語句時,會保存當前的位置。當下次調用迭代器時,將從這個位置重新開始執(zhí)行。只要函數成員的返回類型是枚舉器接口或者其中的一個,迭代器就可以用作函數成員體。
針對C#迭代器的特點,定義了一個如圖4所示的IAction接口作為枚舉器的執(zhí)行元素,封裝了一個執(zhí)行函數(Excute)和一個完成事件(Completed),自定義ServiceCall<TService>抽象類實現IAction接口,通過執(zhí)行函數封裝客戶端異步調用服務的全過程并返回當前主線程觸發(fā)所注冊的完成事件。其派生類ServiceCommand<TService>和ServiceQuery<TResult, TService>則是由具體的服務操作執(zhí)行結果衍生出的返回操作結果的兩種方式。
同時設計了一個ServiceRun類封裝迭代器IAction元素執(zhí)行細節(jié)。具體實現流程如圖5所示。
由于所設計流程是一個迭代循環(huán)的過程,在調用ServiceRun類的同時自動調用一個空的IAction元素的完成事件,以達到啟動迭代器的目的??梢钥闯龇盏恼{用完全通過迭代器內的元素執(zhí)行,通過yield return返回結果,回歸主線程后才會繼續(xù)執(zhí)行后續(xù)代碼,基本實現了WCF服務在Silverlight客戶端異步調用同步返回,并且維持了WCF服務調用的穩(wěn)定性。
本文針對基于WCF和Silverlight典型的Web應用框架對WCF服務的應用限制,在.NET環(huán)境下,設計并實現了面向Silverlight的WCF服務客戶端代理通道工廠的方案。在該方案的基礎上,按照面向對象的基本原則,實現WCF服務的繼承機制;采用C#迭代器機制,完成Silverlight客戶端異步調用的同步化。這些優(yōu)化進一步發(fā)揮了Silverlight技術在RIA設計方面的技術優(yōu)勢,以及WCF服務自身強大的功能優(yōu)勢,使得該框架具有更高的復用度和擴展性,能顯著提高相關應用系統(tǒng)的開發(fā)效率和性能。
參考文獻
[1] STEARN B. A new approach for developing rich internet applications[J]. IEEE Internet Computing, 2007,11(3):67-73.
[2] 蔣金楠. WCF技術剖析(卷一)[M]. 北京:電子工業(yè)出版社,2009:366-367.
[3] 魏永超,銀光志[M]. 北京:清華大學出版社, 2009:4-7.
[4] 程國雄,胡世清. 基于Silverlight互動學習RIA平臺的研究與實現[J]. 計算機工程與科學, 2010,32(7):23-26.
[5] 王非. RIA系統(tǒng)研究與實現[J]. 微計算機應用,2005, 17(5):100-104.
[6] 張金星.基于WCF的軟件開發(fā)過程中若干問題的研究[D]. 吉林:吉林大學, 2010. (收稿日期:2011-07-22)