WCF學習筆記

  首先,先簡單瞭解一下什麼是WCF(Window Communication Foundation),是微軟爲構建面向服務的應用程序所提供的統一編程模型,可以解決不一樣應用程序域,不一樣平臺之間的通訊問題。WCF統一了多重分佈式技術:Webservice、.NetRemoting、.Net企業服務、微軟的消息隊列(MSMQ)。一個WCF有幾個基本概念必需要了解的,編程

契約(ServiceContract):契約是屬於一個服務公開的公共接口,定義了服務端公開的服務方法、使用的傳輸協議、可訪問的地址以及傳輸的消息格式等。既契約告訴咱們能幹什麼。c#

地址(Address):在WCF框架中,每一個服務都具備惟一的地址,其餘服務或者客戶端經過這個地址能夠訪問到這個服務。框架

綁定(Binding):綁定定義了服務與外部通訊的方式。它由一組稱爲綁定元素的元素而構成,這些元素組合在一塊兒造成通訊基礎結構。分佈式

終結點(EndPoint):終結點是用來發送或接收消息(或同時執行這兩種操做)的構造。一個終節點由三個要素組成,分別是:地址、綁定和契約。函數

宿主(Host):WCF服務必須承載於某個進程中。宿主是控制服務的生存期的應用程序。工具

  瞭解了WCF的一些基本概念後,接下來去搭一個簡單的WCF服務,首先定義一個接口:測試

 [ServiceContract]//在接口上聲明ServiceContract特性,表示這個是一個契約
    public  interface  IWCFDemo
    {
        [OperationContract]//在方法上聲明OperationContract表示該方法是一個對外的服務
        int Add(int a,int b);
        [OperationContract]
        int  Del(int a,int b);

        string GetTime();//此方法未被聲明是一個對外的服務
    }

  上面的代碼中,接口上打上ServiceContract,在這須要添加ServiceContract的引用,在System.ServiceModel程序集下,表示該接口是一個契約,在方法上聲明OperationContract,表示該方法是一個對外的服務,遠程客戶端能夠調用的到該方法,其中string GetTime();未被聲明OperationContract,這個方法不對外公佈。spa

  而後是添加服務去實現IWCFDemo這個接口調試

 public class WCFDemo : IWCFDemo//實現IWCFDemo接口
    {

        public int IWCFDemo.Add(int a, int b)
        {
            return a + b;
        }

        public int IWCFDemo.Del(int a, int b)
        {
            return a - b;
        }

        public string IWCFDemo.GetTime()
        {
            return DateTime.Now.ToString();
        }
    }

  好了至此,咱們已經把一個WCF的服務給建立好了,接下來是要將這個服務承載於宿主中。和爲這個服務分配一個訪問的地址。這時,須要新建一個App.config配置文件code

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.serviceModel>
    <services>
      <!--配置一個服務(注意:這裏能夠配置多個服務)-->
      <service name="BLL.WCFDemo" behaviorConfiguration="behaviorConfiguration">
        <!--name爲服務的名稱,behaviorConfiguration給這個服務定義一些行爲-->
        <host>
          <baseAddresses>
            <add baseAddress="http://127.0.0.1:8090/"/><!--服務的訪問地址-->
          </baseAddresses>
        </host>
        <!--終結點由地址,綁定,契約-->
        <endpoint address="" binding="basicHttpBinding" contract="IBLL.IWCFDemo">
        </endpoint>
      </service>

    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviorConfiguration">
          <serviceMetadata httpGetEnabled="true"/><!--給behaviorConfiguration定義一些行爲-->
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

  接下來是爲這個服務提供一個運行的宿主,經過該宿主程序來啓動咱們的服務。這裏可使用控制檯程序,winform程序。在這,使用了控制檯程序

ServiceHost  host=new ServiceHost(typeof(WCFDemo));//將服務寄宿在宿主中
            host.Open();//運行
            Console.WriteLine("服務已啓動、、、");
            Console.ReadKey(true);
            host.Close();關閉

  好了,到了這一步咱們就能夠測試一下能不能調用獲得服務,先是啓動宿主,讓服務在宿主中運行

  而後打開WCF測試客戶端,在VS的安裝目錄下~\Microsoft Visual Studio 11.0\Common7\IDE目錄下的WcfTestClient.exe,在文件->添加服務中,將服務的地址輸入進去,這時就能夠看到正在運行的服務,咱們發現,只有Add()與Del(),兩個方法,而GetTime()因爲沒有聲明爲對外的服務,在這是沒法調用的到。

在雙擊某一個服務時在右邊的窗口,會出現一個能夠調用該服務的窗口

  上面的方法是用自帶的WCF客戶端測試工具測試,若是須要本身模擬一個客戶端去測試的話會比較麻煩一點,下面詳細的介紹一下如何去模擬客戶端來測試WCF服務。在這我用控制檯應用程序來作測試。首先新建一個客戶端Client控制檯應用程序。

  而後是啓動vs開發人員命令提示,執行「cd:E:\c#項目\WCFDemo」-->"E:"定位到項目的解決方案的目錄下,啓動WCF的宿主服務,執行「svcutil http://localhost:8090/?wsdl /o:WCFDemoClient.cs」

  將生成的WCFDemoClient.cs與output.config文件添加到新建的Client控制檯的應用程序中,並把output.config文件名改成App.cinfig。在主程序中去調用WCF服務

static void Main(string[] args)
        {
            WCFDemoClient client = new WCFDemoClient();
            Console.WriteLine(client.Add(2, 3));
            Console.ReadKey();
        }

  調試時將宿主程序運行起來,而後啓動客戶端的程序,當咱們調用Add()這個函數時,控制檯輸出的結果爲5,表示咱們已經調用了這個服務

  至此,一個簡單的WCF服務的Demo已經基本完成,當一個程序中有許多不一樣的服務,能夠將不一樣的服務綁定不一樣的地址對外發布,服務端就能夠調用獲得對外發布的服務,能夠輕鬆的作到集羣,而且其中一個服務出現問題,而不影響其餘的服務,下降耦合度,便於維護。

相關文章
相關標籤/搜索