- WCF技術剖析(卷1)
- 蔣金楠
- 1248字
- 2018-12-27 11:32:35
1.3.4 步驟四 通過自我寄宿的方式寄宿服務
WCF服務須要依存一個運行著的進程(宿主),服務寄宿就是為服務指定一個宿主的過程。WCF是一個基于消息的通信框架,采用基于終結點(Endpoint)的通信手段。終結點由地址(Address)、綁定(Binding)和契約(Contract)三要素組成,如圖1-4所示。由于三要素的首字母分別為A、B、C,所以就有了易于記憶的公式:Endpoint = ABC。一個終結點包含了實現通信所必需的所有信息,我們可以這樣認識終結點的ABC:

圖1-4 終結點三要素
● 地址(Address):地址決定了服務的位置,解決了服務尋址的問題,第2章提供了對地址和尋址機制的詳細介紹。
● 綁定(Binding):綁定實現了通信的所有細節,包括網絡傳輸、消息編碼,以及其他為實現某種功能(比如安全、可靠傳輸、事務等)對消息進行的相應處理。WCF中具有一系列的系統定義綁定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等,第3章提供對綁定的詳細介紹。
● 契約(Contract):契約是對服務操作的抽象,也是對消息交換模式及消息結構的定義。第4章提供對服務契約的詳細介紹。
服務寄宿的目的就是開啟一個進程,為WCF服務提供一個運行的環境。通過為服務添加一個或多個終結點,使之暴露給潛在的服務消費者。服務消費者最終通過相匹配的終結點對該服務進行調用。我們完全可以通過代碼的方式完成所有的服務寄宿工作,下面的代碼體現了通過一個控制臺應用對CalculatorService的寄宿:
using System; using System.ServiceModel; using System.ServiceModel.Description; using Artech.WcfServices.Contracts; using Artech.WcfServices.Services; namespace Artech.WcfServices.Hosting { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof (CalculatorService))) { host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(),"http://127.0.0.1:9999/calculatorservice"); if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/ calculatorservice/metadata"); host.Description.Behaviors.Add(behavior); } host.Opened += delegate { Console.WriteLine("CalculaorService已經啟動,按任意鍵終止服務!"); }; host.Open(); Console.Read(); } } } }
WCF服務寄宿通過一個特殊的對象完成:ServiceHost。在上面的例子中,基于WCF服務的類型(typeof(CalculatorService))創建了ServiceHost對象,并添加了一個終結點。具體地址為http://127.0.0.1:9999/calculatorservice,采用WsHttpBinding,并指定了服務契約的類型ICalculator。
松耦合是SOA的一個基本的特征,WCF應用中客戶端和服務端的松耦合體現在客戶端只須要了解WCF服務基本的描述,而無須知道具體的實現細節,就可以實現正常的服務調用。WCF服務的描述通過元數據(Metadata)的形式發布出來。WCF中元數據的發布通過一個特殊的服務行為ServiceMetadataBehavior來實現。在上面提供的服務寄宿代碼中,我們為創建的ServiceHost添加了ServiceMetadataBehavior,并采用了基于HTTP-GET的元數據獲取方式,元數據的發布地址通過ServiceMetadataBehavior的HttpGetUrl指定。在調用ServiceHost的Open方法對服務成功寄宿后,我們可以通過該地址獲取服務相關的元數據。在IE地址欄上鍵入http://127.0.0.1:9999/calculatorservice/metadata,你將會得到以WSDL形式體現的服務元數據,如圖1-5所示。

圖1-5 通過HTTP-GET的方式獲取WCF服務的元數據
在進行真正的WCF應用開發時,一般不會直接通過編碼的方式進行終結點的添加和服務行為的定義,而是通過配置的方式進行。上面添加終結點和定義服務行為的代碼可以用下面的配置代替:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl= "http://127.0.0.1:9999/calculatorservice/metadata" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="metadataBehavior" name= "Artech.WcfServices.Services.CalculatorService"> <endpoint address="http://127.0.0.1:9999/calculatorservice" binding="wsHttpBinding" contract="Artech.WcfServices. Contracts.ICalculator" /> </service> </services> </system.serviceModel> </configuration>
對于初學者來說,WCF的配置顯得過于復雜,直接對配置文件進行手工編輯不太現實。在這種情況下,可以直接使用VS提供的配置工具。你可以通過VS的工具(Tools)菜單,選擇“WCF Service Configuration Editor”子項,開啟這樣的一個配置編輯器,如圖1-6所示。

圖1-6 如何獲得WCF服務配置編輯器
如果采用了上述的配置,服務寄宿代碼將會得到極大的精簡,只須包含下面幾行代碼:
namespace Artech.WcfServices.Hosting { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Opened += delegate { Console.WriteLine("CalculaorService已經啟動,按任意鍵終止服務!"); }; host.Open(); Console.Read(); } } } }