在以前的Silverlight應用程序中,我們都是通過(guò)給Web項目添加一個(gè)新的WCF服務(wù),并填充代碼的方式創(chuàng )建Windows通信基礎(WCF)服務(wù)的,這種方法導致我在測試和調試我的服務(wù)配置時(shí)遇到了許多問(wèn)題,有沒(méi)有更好的方法來(lái)添加一個(gè)WCF服務(wù)?
創(chuàng )建WCF服務(wù)的方法很多,這里要介紹的方法會(huì )讓你解決問(wèn)題變得更容易,它利用Visual Studio 2010中提供的輕量級WCF配置選項。
向Silverlight應用程序添加一個(gè)服務(wù)最簡(jiǎn)單的方法是,向Silverlight解決方案的Web應用程序項目添加一個(gè)WCF服務(wù)項,當你添加一個(gè)名為T(mén)estServiceCB的服務(wù)時(shí),Visual Studio會(huì )用相同的服務(wù)定義創(chuàng )建一個(gè)接口。
public interface ITestServiceCB
{ [OperationContract]
void DoWork();
}
此外,Visual Studio會(huì )添加一個(gè)TestServiceCB.svc文件,其內容如下,它實(shí)現了服務(wù)接口:
{
public void DoWork()
{ }
}
當你選中TestServiceCB.svc,并從上下文菜單中選擇“在瀏覽器中查看”,瀏覽器會(huì )打開(kāi)URL localhost:55778/TestServiceCB.svc,顯示關(guān)于服務(wù)的一些信息,注意URL中的端口55778,在你的環(huán)境中可能會(huì )有所不同。
這個(gè)解決方案只適合簡(jiǎn)單的服務(wù),對于涉及到業(yè)務(wù)和數據訪(fǎng)問(wèn)層的復雜服務(wù)可能需要集成和單元測試,使用不同的主機部署相同的服務(wù)也比Web應用程序更困難,對于這些情況,圖2顯示的項目結構可能會(huì )更好一點(diǎn)。

圖1 WCF服務(wù)的一個(gè)獨立服務(wù)庫,允許你以多種方式托管它們并協(xié)助測試你的配置,這不是Visual Studio的默認行為,但難度并不大
使用這種方法,所有用于實(shí)現服務(wù)的接口和類(lèi)都被包含在一個(gè)單獨的服務(wù)庫項目里面,Web項目仍然托管服務(wù),根據需要調用服務(wù)庫中的類(lèi),創(chuàng )建一或多個(gè)測試項目直接測試服務(wù)庫中的類(lèi),從而減少出現問(wèn)題的可能性,給你提供了一個(gè)繞過(guò)客戶(hù)端進(jìn)行調試的方法,在Silverlight和WCF世界中這一點(diǎn)特別重要,因為默認情況下,服務(wù)返回的所有異常都只提供了很少甚至沒(méi)有提供診斷信息。
如果要創(chuàng )建這個(gè)結構,首先給你的Silverlight解決方案添加一個(gè)WCF服務(wù)庫,默認情況下,Visual Studio會(huì )給你的服務(wù)庫項目添加一個(gè)名為IService1.cs的接口和名為Service1.cs的服務(wù)類(lèi),它們和你直接在Web應用程序中添加WCF服務(wù)時(shí)創(chuàng )建的接口和代碼隱藏類(lèi)相似,你應該修改接口和服務(wù)類(lèi)的名字,反映出你的服務(wù)名,作為一個(gè)例子,一個(gè)叫TestService的服務(wù)可能包含以下ITestService接口:
public interface ITestService
{
[OperationContract]
DateInformation GetFutureDate(ref ServiceContext context,
int futureDays);
}
和一個(gè)對應的實(shí)現服務(wù)的服務(wù)類(lèi):
{
public DateInformation GetFutureDate(
ref ServiceContext context, int futureDays)
{
return null;
}
}
為了在SIlverlight應用程序對應的Web應用程序中托管你的服務(wù),你需要添加一個(gè)到服務(wù)庫項目的引用,并創(chuàng )建一個(gè)名為T(mén)estService.svc的文件,你必須首先以文本格式添加這個(gè)文件,然后修改前綴,給TestService.svc文件增加下面的標記:
你還需要在Web應用程序的Web.config文件中配置你的服務(wù),WCF團隊在Microsoft .NET Framework 4中做了很大努力,通過(guò)使用綁定的默認值減少了WCF配置的復雜性,這意味著(zhù)你不用自己添加任何配置信息,但對開(kāi)發(fā)而言,有些配置覆蓋掉可能更好,將下面的內容添加到你的Web.config文件中:
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
服務(wù)Metadata標簽告訴WCF發(fā)布當你向Silverlight應用程序添加一個(gè)服務(wù)引用時(shí)使用到的元數據,在你的本地機器上,Visual Studio會(huì )自動(dòng)為你的服務(wù)分配一個(gè)地址,但在部署到生產(chǎn)環(huán)境時(shí),你需要添加額外的配置信息指定服務(wù)的真實(shí)URL,注意Visual Studio會(huì )在服務(wù)庫項目的App.config文件中創(chuàng )建一個(gè)配置小節,但WCF會(huì )忽略該配置信息。
測試服務(wù)配置
現在你可以測試你的服務(wù),首先測試你的配置文件設置是否正確,在解決方案資源管理器中選中SVC文件,點(diǎn)擊右鍵,在彈出的菜單中選擇“在瀏覽器中查看”,瀏覽器將會(huì )顯示關(guān)于服務(wù)的一些信息,注意自動(dòng)生成的URL。
為了測試你的服務(wù)是否可以真正調用,Visual Studio提供了WCF測試客戶(hù)端工具,打開(kāi)Visual Studio命令行窗口,在命令提示符后輸入命令wcftestclient,彈出該客戶(hù)端窗口后,選擇“文件”*“添加服務(wù)”選擇要測試的服務(wù),然后輸入瀏覽器中顯示的URL,從測試客戶(hù)端,你可以結合數據調用每一個(gè)服務(wù)方法,并查看結果,WCF測試客戶(hù)端如圖2所示。

圖2 WCF測試客戶(hù)端提供了一個(gè)方法驗證服務(wù)是否正確啟動(dòng),
界面右側的“請求”和“響應”區域提供了一個(gè)方法進(jìn)行冒煙測試
至此,你已經(jīng)為服務(wù)完成了服務(wù)端檢查,你可以增加你認為合適的操作、業(yè)務(wù)和數據訪(fǎng)問(wèn)層以擴大你的服務(wù),我總是會(huì )增加一個(gè)服務(wù)測試項目測試服務(wù)庫,這種測試通常會(huì )獲得更高回報,在通過(guò)Silverlight客戶(hù)端應用程序診斷服務(wù)問(wèn)題時(shí),可以幫助我避免掉耗時(shí)且令人沮喪的問(wèn)題。

