WCF 入門練習

開發 WCF 應用程式基本上有三項工作:
  • 撰寫 WCF 服務,這包括定義服務介面,以及撰寫實作服務介面的類別。
  • 部署 WCF 服務。
  • 撰寫 WCF 用戶端程式。

以下是一個極簡單的 WCF 應用程式入門練習,使用 Visual Studio 2008,C# 語言。做此練習時,至少須具備 HTTP 的基本觀念,並熟悉 IIS 管理員的操作(例如:建立 IIS 虛擬目錄)。此外,最好是以系統管理員的身分登入 Windows,以免因權限不足而發生一些怪問題。

Part I. 撰寫 WCF 服務

首先要建立一個 WCF 服務的專案,然後定義此服務的界面。步驟如下:
  1. New 一個新專案,專案範本選擇 C# > WCF > WCF Service Library。Name 欄位輸入 HelloWcf,按 OK。參考下圖:



    此專案範本會幫你加入三個檔案:IService1.cs、Service1.cs、和 App.config。
  2. 在 Solution Explorer 中找到 Service1.cs,在檔名上點右鍵,選 Rename,將檔案名稱改為 "HelloService.cs"。此修改檔名的動作除了會一併修改類別名稱,連 App.config 裡面對應的設定也會自動幫你改好。如果你是直接去改檔案中的介面名稱,要記得一併修改 App.config 中對應的設定:service 元素的 name 屬性。
  3. 用同樣的方法把 IService1.cs 改名為 IHelloService.cs。此動作會一併修改 App.config 中的 server 元素底下的 endpoint 子元素的 contract 屬性。
  4. 儲存整個專案。在儲存對話窗中,Solution 和 Project 名稱皆指定為 HelloWcf,並勾選 "Create directory for solution" 核取方塊。
  5. 編輯 IHelloService.cs,你會看到裡面已經有一個 IHelloService 介面和一個 CompositeType 類別。注意 IHelloService 有套用 ServiceContract attribute,表示它是定義服務合約的介面,你要提供給用戶端呼叫的操作就是在此定義。CompositeType 類別是套用 DataContract attribute,表示它是用來定義呼叫操作時所需傳遞的資料型別。IHelloService 介面中已經有兩個方法:GetData 和 GetDataUsingDataContract,先不管它們,我們要定義一個 Hello 方法,程式碼如下:

    [OperationContract]
    string Hello(string name);
只要有標示 OperationContract attribute 的方法,就表示可供 WCF 用戶端呼叫;相反地,若無標示此 attribute,就是僅供 WCF 服務自己使用。

到此步驟就完成服務介面的定義了。接著要依照此介面來實作服務:
  1. 編輯 HelloService.cs,先確定它的宣告是否有實作 IHelloService 介面,然後在類別中加入以下程式碼:

    public string Hello(string name)
    {
        return "Hello, " + name;
    }
  2. Build 專案。
VS2008 的 WCF 專案模板所幫你產生的類別與介面不必是一對一,亦即你可以定義多個服務介面,然後用一個類別來實作多個介面。

Part II. 部署 WCF 服務

WCF 服務必須運行於 host process 中,這個 host process 可以是 IIS 、WAS、Windows 服務、或你自己開發的 .NET 應用程式(即所謂的 self-hosting)。運行於 IIS 和 WAS 環境都可享有生命週期控制的優點,這裡要示範的是將剛才建立的 WCF 服務部署到 IIS。
  1. 利用 IIS 管理員建立一個網站,將此網站使用的連接埠設定為 8000,實體路徑指向一個新建立的空資料夾,例如:D:\Web\WCF。身分驗證的選項請將「啟用匿名存取」打勾。
  2. 回到 VS2008,在 Solution Explorer 中的專案名稱上點右鍵,選 Publish,目標路徑輸入:http://localhost:8000/,然後按「Publish」鈕。參考下圖:


部署完成後,到實際部署的資料夾中看一下產生了哪些檔案。你應該會看到:
  • HelloWcf.HelloService.svc
  • Web.config
  • bin 資料夾
現在,部署的動作已經完成,你可以開啟瀏覽器測試一下,網址輸入:http://localhost:8000/HelloWcf.HelloService.svc。若一切順利,應該會看到類似這樣的畫面:



若不幸看到的是:



那表示你可能不是照前面的步驟建立新網站,而是在原先的 IIS 預設網站上建立虛擬目錄,而且原先的預設網站並沒有設定 .svc 資源的處理方式。此時請開啟 IIS 管理員,在網站上點右鍵 > 內容 > 主目錄頁籤 > 設定 > 對應頁籤,看看「應用程式副檔名」清單中是否有 .svc。若沒有,就按「新增」,然後在新開啟的對話窗中:
  • 「執行檔」輸入 「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll」
  • 「副檔名」輸入「.svc」
  • 「指令動詞」指定為「GET,HEAD,POST,DEBUG」
設定完成後再用瀏覽器測試一下看看是否已解決。
如果是 IIS 7,在用瀏覽器測試 .svc 網址時可能會看到「HTTP 錯誤 404.3 - Not found」,此時可以試試以下命令:

C:\Windows\Microsoft.NET\Framewrok\v3.0\Windows Communication Foundation\ServiceModelReg.exe –i

此命令會向 IIS 註冊 WCF 服務,並更新指令碼對應(scriptmap)。

Part III. 撰寫 WCF 用戶端程式

確認 WCF 服務已成功部署於 IIS 之後,接著寫一個簡單的用戶端程式來測試 WCF 服務。步驟如下:
  1. 在同一個 Solution 中加入一個新的 Console 應用程式專案,專案命名為 HelloWcfClient,並將它設定為起始專案(Set as StartUp Project)。
  2. 在 Solution Explorer 中的 HelloWcfClient 專案名稱上點右鍵 > Add Server Reference。
  3. 在「Add Server Reference」對話窗中,Address 欄位輸入「http://localhost:8000/HelloWcf.HelloService.svc」,再按「Go」,應會看到如下圖的結果。接著在 Namespace 欄位中輸入「HelloService」,按「OK」。



  4. 編輯 Program.cs,程式碼如下:


       1:  using System;
       2:  
    
       3:  namespace HellWcfClient
       4:  {
       5:      class Program
       6:      {
       7:          static void Main(string[] args)
       8:          {
       9:              HelloService.HelloServiceClient client;
      10:              using (client = new HelloService.HelloServiceClient())
      11:              {
      12:                  string s = client.Hello("Michael");
      13:                  Console.WriteLine(s);
      14:              }
      15:          }
      16:      }
      17:  }
    Note: 這裡使用 using 是建議寫法,若你不用 using,最好記得在用完 WCF 服務時呼叫 proxy class 的 Close 方法。
  5. 按 Ctrl+F5 執行看看,應該能看到畫面上輸出「Hello, Michael」。
要特別說明的是步驟 2:Add Server Reference。這個 ASR 動作會向你指定的 WCF 服務取得 metadata,並據以產生 proxy class 和組態檔內容。產生出來的 proxy class 原始碼檔名為 Reference.cs,你可以在專案目錄下的 "Server References\[namespace]" 目錄下找到它,或者將 Solution Explorer 視窗的「Show All Files」功能打開,便可以在 Server References > [namespace] > Reference.svcmap 節點下找到這個檔案。

ASR 在背後其實是使用 svcutil.exe,因此你也可以自己手動產生 proxy class 和組態檔。作法是開啟「Visual Studio 2008 Command Prompt」視窗,輸入以下命令:

svcutil.exe http://locahost:8000/HelloWcf.HelloService.svc

Post Comments

技術提供:Blogger.