在Silverlight應(yīng)用程序中調(diào)試WCF服務(wù)
原創(chuàng)【51CTO獨(dú)家特稿】在以前的Silverlight應(yīng)用程序中,我們都是通過(guò)給Web項(xiàng)目添加一個(gè)新的WCF服務(wù),并填充代碼的方式創(chuàng)建Windows通信基礎(chǔ)(WCF)服務(wù)的,這種方法導(dǎo)致我在測(cè)試和調(diào)試我的服務(wù)配置時(shí)遇到了許多問(wèn)題,有沒(méi)有更好的方法來(lái)添加一個(gè)WCF服務(wù)?
創(chuàng)建WCF服務(wù)的方法很多,這里要介紹的方法會(huì)讓你解決問(wèn)題變得更容易,它利用Visual Studio 2010中提供的輕量級(jí)WCF配置選項(xiàng)。
向Silverlight應(yīng)用程序添加一個(gè)服務(wù)最簡(jiǎn)單的方法是,向Silverlight解決方案的Web應(yīng)用程序項(xiàng)目添加一個(gè)WCF服務(wù)項(xiàng),當(dāng)你添加一個(gè)名為TestServiceCB的服務(wù)時(shí),Visual Studio會(huì)用相同的服務(wù)定義創(chuàng)建一個(gè)接口。
- [ServiceContract]
- public interface ITestServiceCB
- {
- [OperationContract]
- void DoWork();
- }
此外,Visual Studio會(huì)添加一個(gè)TestServiceCB.svc文件,其內(nèi)容如下,它實(shí)現(xiàn)了服務(wù)接口:
- public class TestServiceCB : ITestServiceCB {
- public void DoWork() {
- }
- }
當(dāng)你選中TestServiceCB.svc,并從上下文菜單中選擇“在瀏覽器中查看”,瀏覽器會(huì)打開(kāi)URL localhost:55778/TestServiceCB.svc,顯示關(guān)于服務(wù)的一些信息,注意URL中的端口55778,在你的環(huán)境中可能會(huì)有所不同。
這個(gè)解決方案只適合簡(jiǎn)單的服務(wù),對(duì)于涉及到業(yè)務(wù)和數(shù)據(jù)訪問(wèn)層的復(fù)雜服務(wù)可能需要集成和單元測(cè)試,使用不同的主機(jī)部署相同的服務(wù)也比Web應(yīng)用程序更困難,對(duì)于這些情況,圖2顯示的項(xiàng)目結(jié)構(gòu)可能會(huì)更好一點(diǎn)。
圖1 WCF服務(wù)的一個(gè)獨(dú)立服務(wù)庫(kù),允許你以多種方式托管它們并協(xié)助測(cè)試你的配置,
這不是Visual Studio的默認(rèn)行為,但難度并不大
使用這種方法,所有用于實(shí)現(xiàn)服務(wù)的接口和類都被包含在一個(gè)單獨(dú)的服務(wù)庫(kù)項(xiàng)目里面,Web項(xiàng)目仍然托管服務(wù),根據(jù)需要調(diào)用服務(wù)庫(kù)中的類,創(chuàng)建一或多個(gè)測(cè)試項(xiàng)目直接測(cè)試服務(wù)庫(kù)中的類,從而減少出現(xiàn)問(wèn)題的可能性,給你提供了一個(gè)繞過(guò)客戶端進(jìn)行調(diào)試的方法,在Silverlight和WCF世界中這一點(diǎn)特別重要,因?yàn)槟J(rèn)情況下,服務(wù)返回的所有異常都只提供了很少甚至沒(méi)有提供診斷信息。
如果要?jiǎng)?chuàng)建這個(gè)結(jié)構(gòu),首先給你的Silverlight解決方案添加一個(gè)WCF服務(wù)庫(kù),默認(rèn)情況下,Visual Studio會(huì)給你的服務(wù)庫(kù)項(xiàng)目添加一個(gè)名為IService1.cs的接口和名為Service1.cs的服務(wù)類,它們和你直接在Web應(yīng)用程序中添加WCF服務(wù)時(shí)創(chuàng)建的接口和代碼隱藏類相似,你應(yīng)該修改接口和服務(wù)類的名字,反映出你的服務(wù)名,作為一個(gè)例子,一個(gè)叫TestService的服務(wù)可能包含以下ITestService接口:
- [ServiceContract]
- public interface ITestService
- {
- [OperationContract]
- DateInformation GetFutureDate(ref ServiceContext context,
- int futureDays);
- }
和一個(gè)對(duì)應(yīng)的實(shí)現(xiàn)服務(wù)的服務(wù)類:
- public class TestService : ITestService {
- public DateInformation GetFutureDate(
- ref ServiceContext context, int futureDays) {
- return null;
- }
- }
為了在SIlverlight應(yīng)用程序?qū)?yīng)的Web應(yīng)用程序中托管你的服務(wù),你需要添加一個(gè)到服務(wù)庫(kù)項(xiàng)目的引用,并創(chuàng)建一個(gè)名為TestService.svc的文件,你必須首先以文本格式添加這個(gè)文件,然后修改前綴,給TestService.svc文件增加下面的標(biāo)記:
- <%@ ServiceHost Language="C#" Debug="true" Service = "MyTest-
- Service.TestService" %>
你還需要在Web應(yīng)用程序的Web.config文件中配置你的服務(wù),WCF團(tuán)隊(duì)在Microsoft .NET Framework 4中做了很大努力,通過(guò)使用綁定的默認(rèn)值減少了WCF配置的復(fù)雜性,這意味著你不用自己添加任何配置信息,但對(duì)開(kāi)發(fā)而言,有些配置覆蓋掉可能更好,將下面的內(nèi)容添加到你的Web.config文件中:
- <system.serviceModel>
- <behaviors>
- <serviceBehaviors>
- <behavior>
- <serviceMetadata httpGetEnabled="true"/>
- <serviceDebug includeExceptionDetailInFaults="false"/>
- </behavior>
- </serviceBehaviors>
- </behaviors>
- <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
- </system.serviceModel>
服務(wù)Metadata標(biāo)簽告訴WCF發(fā)布當(dāng)你向Silverlight應(yīng)用程序添加一個(gè)服務(wù)引用時(shí)使用到的元數(shù)據(jù),在你的本地機(jī)器上,Visual Studio會(huì)自動(dòng)為你的服務(wù)分配一個(gè)地址,但在部署到生產(chǎn)環(huán)境時(shí),你需要添加額外的配置信息指定服務(wù)的真實(shí)URL,注意Visual Studio會(huì)在服務(wù)庫(kù)項(xiàng)目的App.config文件中創(chuàng)建一個(gè)配置小節(jié),但WCF會(huì)忽略該配置信息。
測(cè)試服務(wù)配置
現(xiàn)在你可以測(cè)試你的服務(wù),首先測(cè)試你的配置文件設(shè)置是否正確,在解決方案資源管理器中選中SVC文件,點(diǎn)擊右鍵,在彈出的菜單中選擇“在瀏覽器中查看”,瀏覽器將會(huì)顯示關(guān)于服務(wù)的一些信息,注意自動(dòng)生成的URL。
為了測(cè)試你的服務(wù)是否可以真正調(diào)用,Visual Studio提供了WCF測(cè)試客戶端工具,打開(kāi)Visual Studio命令行窗口,在命令提示符后輸入命令wcftestclient,彈出該客戶端窗口后,選擇“文件”*“添加服務(wù)”選擇要測(cè)試的服務(wù),然后輸入瀏覽器中顯示的URL,從測(cè)試客戶端,你可以結(jié)合數(shù)據(jù)調(diào)用每一個(gè)服務(wù)方法,并查看結(jié)果,WCF測(cè)試客戶端如圖2所示。
圖2 WCF測(cè)試客戶端提供了一個(gè)方法驗(yàn)證服務(wù)是否正確啟動(dòng),
界面右側(cè)的“請(qǐng)求”和“響應(yīng)”區(qū)域提供了一個(gè)方法進(jìn)行冒煙測(cè)試
至此,你已經(jīng)為服務(wù)完成了服務(wù)端檢查,你可以增加你認(rèn)為合適的操作、業(yè)務(wù)和數(shù)據(jù)訪問(wèn)層以擴(kuò)大你的服務(wù),我總是會(huì)增加一個(gè)服務(wù)測(cè)試項(xiàng)目測(cè)試服務(wù)庫(kù),這種測(cè)試通常會(huì)獲得更高回報(bào),在通過(guò)Silverlight客戶端應(yīng)用程序診斷服務(wù)問(wèn)題時(shí),可以幫助我避免掉耗時(shí)且令人沮喪的問(wèn)題。
原文名:Debug WCF Services in Silverlight Apps 黃永兵 譯
原文出處:http://visualstudiomagazine.com/articles/2010/11/01/visual-studio-2010-tips-2.aspx
【編輯推薦】