1. 程式人生 > >WCF學習之旅第一講 簡單的WCF應用

WCF學習之旅第一講 簡單的WCF應用

       本應用功能雖然簡單,但他具有一個完整的WCF應用的基本結構。客戶端和服務端通過執行在同一臺機器上的不同程式來模擬,下圖體現了客戶端和服務端程序互相呼叫的關係

步驟一:構建整個解決方案

本程式通過vs2012創造2個程式,分別為服務端WcfHosting和客戶端WCFClient如圖

InterFaces:一個類庫專案,定義服務契約(Service Contract),引用System.ServiceMode程式集(WCF框架的絕大部分實現和API定義在該程式集中);

Server:一個類庫專案,提供對WCF服務的實現。定義在該專案中的所有WCF服務實現了定義在Contracts中相應的服務契約,所以Services具有對Contracts專案的引用;

Hosting:一個控制檯(Console)應用,實現對定義在Services專案中的服務的寄宿,該專案須要同時引用Contracts和Services兩個專案和System.ServiceMode程式集;

Client:一個控制檯應用模擬服務的客戶端,該專案引用System.ServiceMode程式集。

步驟二:建立服務契約

WCF採用基於契約的互動方式實現了服務的自治,以及客戶端和服務端之間的鬆耦合。WCF包含四種類型的契約:服務契約、資料契約、訊息契約和錯誤契約,這裡著重於服務契約。從功能上講,服務契約抽象了服務提供的所有操作;而站在訊息交換的角度來看,服務契約則定義了基於服務呼叫的訊息交換過程中,請求訊息和回覆訊息的結構,以及採用的訊息交換模式。

一般地,我們通過介面的形式定義服務契約。通過下面的程式碼,將一個介面InterFace定義成服務契約。WCF廣泛採用基於自定義特性(Custom Attribtue)的宣告式程式設計模式,我們通過在介面上應用System.ServiceModel.ServiceContractAttribute特性將一個介面定義成服務契約。

using System.ServiceModel;

namespace ClassLibrary
{
    [ServiceContract]
    public interface InterFaces
    {
        [OperationContract]
        int SayHello();

    }
}
步驟三:建立服務

當服務契約成功建立時,我們需要通過實現服務契約來建立具體的WCF服務。WCF服務Server定義在Servers專案中,實現了服務契約介面InterFaces,實現了所有的服務操作。Server(服務)定義如下:

using System.ServiceModel;
using ClassLibrary;
namespace ClassLibrary
{
    public class Server:InterFaces
    {
        public int SayHello(int x, int y)
        {

            return x + y;         }

} }


步驟四:通過自我寄宿的方式寄宿服務

WCF服務需要依存一個執行著的程序(宿主),服務寄宿就是為服務指定一個宿主的過程。WCF是一個基於訊息的通訊框架,採用基於終結點(Endpoint)的通訊手段。終結點由地址(Address)、繫結(Binding)和契約(Contract)三要素組成,如圖3所示。由於三要素應為首字母分別為ABC,所以就有了易於記憶的公式:Endpoint = ABC。一個終結包含了實現通訊所必需的所有資訊,我們可以這樣認識終結點的ABC:

  • 地址(Address):地址決定了服務的位置,解決了服務定址的問題。
  • 繫結(Binding):繫結實現了通訊的所有細節,包括網路傳輸、訊息編碼,以及其他為實現某種功能(比如安全、可靠傳輸、事務等)對訊息進行的相應處理。WCF中具有一系列的系統定義繫結,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等。
  • 契約(Contract):契約是對服務操作的抽象,也是對訊息交換模式以及訊息結構的定義。

服務寄宿的目的就是開啟一個程序,為WCF服務提供一個執行的環境。通過為服務新增一個或多個終結點,使之暴露給潛給的服務消費者。服務消費者最終通過相匹配的終結點對該服務進行呼叫。由於在進行真正的WCF應用開發時,一般不會直接通過編碼的方式進行終結點的新增和服務行為的定義,而是通過配置的方式進行。所以就不再寫配置程式碼體現了通過一個控制檯應用對CalculatorService的寄宿,程式碼新增終結點和定義服務行為的程式碼可以用下面的配置代替:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors >
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true"
                   httpGetUrl="http://127.0.0.1:3721/Server/metadata"/>         
        </behavior>
      </serviceBehaviors>      
    </behaviors>
    <services>
      <service name="ClassLibrary.Server"
                behaviorConfiguration="metadataBehavior">
        <endpoint address="http://127.0.0.1:3721/Server"
                   binding="wsHttpBinding"
                   contract="ClassLibrary.InterFaces" />
      </service>            
    </services>
    <bindings>        
    </bindings>
  </system.serviceModel>
</configuration>

如果採用了上訴的配置,服務寄宿程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ClassLibrary;
using System.ServiceModel;

namespace Hosting
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(Server)))
            {

                host.Opened += delegate
                {

                    Console.WriteLine("WCF已經啟動....");
                };
                host.Open();
                Console.ReadLine();

            }
        }
    }
}

步驟五:建立客戶端呼叫服務

服務被成功寄宿後,服務端便開始了服務呼叫請求的監聽工作。此外,服務寄宿將服務描述通過元資料的形式釋出出來,相應的客戶端就可以獲取這些元資料建立客戶端程式進行服務的消費。在VS下,當我們新增服務引用的時候,VS在內部幫我們實現元資料的獲取,並藉助這些元資料通過程式碼生成工具(SvcUtil.exe)自動生成用於服務呼叫的服務代理相關的程式碼和相應的配置。

在執行服務寄宿程式(Hosting.exe)的情況下,右鍵點選Client專案,在彈出的上下文選單中選擇“新增服務引用(Add Service References)”,如圖6所示的新增服務引用的對話會顯示出來。在位址列上鍵入服務元資料釋出的源地址:,並指定一個名稱空間,點選OK按鈕,VS為為你生成一系列用於服務呼叫的程式碼和配置。

在一系列自動生成的類中,包含一個服務契約介面、一個服務代理物件和其他相關的類。被客戶端直接用於服務呼叫的是一個繼承自ClientBase<ServiceReference>並實現了InterFaces介面(ServiceReference為客戶端生成的服務契約介面型別)的服務代理類。ClientBase<ServiceReference>的定義如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WCFClient
{
    using ServiceReference;//進行服務呼叫
    class Program
    {
        static void Main(string[] args)
        {
            using (InterFacesClient prox = new InterFacesClient())
            {

                Console.WriteLine(prox.SayHello(7,4));
                Console.ReadLine();
            }
        }
    }
}


到現在WCF簡單應用程式已經完成了,現在我們執行一下,看看效果