WCF學習筆記


  首先,先簡單了解一下什么是WCF(Window Communication Foundation),是微軟為構建面向服務的應用程序所提供的統一編程模型,能夠解決不同應用程序域,不同平台之間的通信問題。WCF統一了多重分布式技術:Webservice、.NetRemoting、.Net企業服務、微軟的消息隊列(MSMQ)。一個WCF有幾個基本概念必須要了解的,

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

地址(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,這個方法不對外公布。

  然后是添加服務去實現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配置文件

<?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已經基本完成,當一個程序中有許多不同的服務,可以將不同的服務綁定不同的地址對外發布,服務端就可以調用得到對外發布的服務,可以輕松的做到集群,並且其中一個服務出現問題,而不影響其他的服務,降低耦合度,便於維護。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM