官术网_书友最值得收藏!

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();
                  }
              }
            }
        }
主站蜘蛛池模板: 达拉特旗| 麟游县| 浑源县| 马山县| 华安县| 博野县| 开阳县| 牡丹江市| 镇江市| 曲阜市| 陇川县| 抚松县| 宁津县| 利津县| 永胜县| 阜康市| 怀来县| 正定县| 家居| 石棉县| 班玛县| 石泉县| 都安| 裕民县| 花莲县| 栾城县| 琼中| 玛沁县| 沙坪坝区| 滨州市| 铜山县| 双辽市| 托克托县| 新绛县| 汝阳县| 内丘县| 双牌县| 江西省| 库伦旗| 华宁县| 邵阳县|