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