第一篇 visual c#程式基礎與wpf應用程式 · pdf file第12章 linq c#...

37
viii 本書以「學以致用」為出發點,因此不以呈現過於複雜且不容易理解的範例程式為 主;結合作者豐富的程式開發教學經驗,透過經典的範例與練習實作,讓你可以 在最短的時間,學會使用C#程式語言搭配Visual Studio 2010開發工具,開發.NET Framework 4平台的應用程式。 第一篇 Visual C#程式基礎與WPF應用程式 1Visual Studio 2010 概述 本章介紹了.NET Framework 4Visual Studio 2010開發工具的不同版本以及安裝環 境,另外,也介紹了開發工具的安裝方式。 2建立WPF視窗應用程式 因為圖形化使用者介面應用程式開發,是最容易吸引初學者的。因此本章以WPF用程式開發為切入點,教導讀者如何使用Visual Studio 2010開發應用程式,並在後 續章節中,透過WPF應用程式幫助讀者學習C#程式語言的語法。 3WPF基本控制項 WPF應用程式可以提供訊息提示、資料輸入及執行命令等功能,但是你必須要先 WPF表單上,透過控制項建立使用者的操作介面。在本章中,將介紹Label TextBoxButton等基本控制項的操作方法,以及程式碼編輯區的基本操作。另一方 面,藉由基本控制項的操作,慢慢為讀者建立程式中使用「物件」的觀念。 4建立WPF功能表選單 建立WPF應用程式時,往往需要在WPF表單中加入許多功能;透過自訂的功能表選 單,可以讓使用者更簡潔的操作WPF應用程式中的功能。本章將為各位介紹如何在 WPF應用程式中建立功能表選單,並且透過功能表選單執行系統的功能。 導讀

Upload: hanhu

Post on 14-Mar-2018

254 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

viii

本書以「學以致用」為出發點,因此不以呈現過於複雜且不容易理解的範例程式為

主;結合作者豐富的程式開發教學經驗,透過經典的範例與練習實作,讓你可以

在最短的時間,學會使用C#程式語言搭配Visual Studio 2010開發工具,開發.NET Framework 4平台的應用程式。

第一篇 Visual C#程式基礎與WPF應用程式

第1章 Visual Studio 2010 概述 本章介紹了.NET Framework 4與Visual Studio 2010開發工具的不同版本以及安裝環境,另外,也介紹了開發工具的安裝方式。

第2章 建立WPF視窗應用程式因為圖形化使用者介面應用程式開發,是最容易吸引初學者的。因此本章以WPF應用程式開發為切入點,教導讀者如何使用Visual Studio 2010開發應用程式,並在後續章節中,透過WPF應用程式幫助讀者學習C#程式語言的語法。

第3章 WPF基本控制項WPF應用程式可以提供訊息提示、資料輸入及執行命令等功能,但是你必須要先在WPF表單上,透過控制項建立使用者的操作介面。在本章中,將介紹Label、TextBox、Button等基本控制項的操作方法,以及程式碼編輯區的基本操作。另一方面,藉由基本控制項的操作,慢慢為讀者建立程式中使用「物件」的觀念。

第4章 建立WPF功能表選單建立WPF應用程式時,往往需要在WPF表單中加入許多功能;透過自訂的功能表選單,可以讓使用者更簡潔的操作WPF應用程式中的功能。本章將為各位介紹如何在WPF應用程式中建立功能表選單,並且透過功能表選單執行系統的功能。

導讀

C-前段-完稿.indd 8 2010/7/13 上午 10:18:14

Page 2: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰

ix

第二篇 C#程式語言基礎與進階議題

第5章 物件導向基礎C#為物件導向的程式語言,先瞭解物件導向的觀念,才容易學會程式語法。經過前面章節的介紹,讀者已經對於應用程式的開發有了基本觀念,會比較容易接受物件

導向的觀念。本章設計了一個簡單的練習,將抽象的物件觀念透過具體的操作,讀

者在操作之後就能正確瞭解C#程式語言的物件導向開發方式。

第6章 資料與變數本章介紹C#程式語言中的變數宣告語法以及資料型別,因為已經學習過物件導向的觀念,讀者可以很容易地瞭解不同種類的變數使用的方式。

第7章 判斷式與迴圈在程式撰寫的過程中,我們會需要將程式邏輯撰寫到程式碼中,此時就會需要使用

到判斷式與迴圈的語法。本章介紹了C#程式語言判斷式與迴圈的撰寫方式,搭配一些容易瞭解的範例實作,讓讀者可以快速學會這一些語法。

第8章 陣列與集合程式中往往需要傳遞或是暫存大量的資料,這時候會需要使用到陣列或是集合來處

理這一些資料。本章介紹C#程式中宣告陣列以及使用集合的語法,重要的是在這一章也介紹了泛型集合以及索引子的使用方式。

第9章 偵錯與例外狀況處理程式撰寫的過程中難免會有錯誤,本章介紹如何使用Visual Studio 2010開發工具進行程式碼的除錯,以及C#程式中處理例外狀況所使用的try...catch語法。

C-前段-完稿.indd 9 2010/7/13 上午 10:18:14

Page 3: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

x

第10章 自訂副程式本章介紹在C#程式中撰寫方法的語法,因為讀者已具有物件導向的基礎,也瞭解程式中變數與判斷式、迴圈的語法,透過本章的介紹,就會知道如何將可以重複使用

的邏輯定義成副程式重複叫用。

第11章 物件導向進階本章針對C#程式物件導向的特性做延伸的介紹,透過精心設計的範例解說,各位就可以很容易瞭解抽象類別與介面的用途。另外,本章也介紹在C#物件導向實作中常會使用到的委派及事件宣告的語法。

第三篇 新一代程式開發與UML實戰

第12章 LINQC# 程式語言中,Language-Integrated Query (LINQ) 是一個很重要的新功能,可以減化了很多程式存取資料時所需要的程式碼。本章介紹LINQ的基本語法、LINQ to XML、LINQ to SQL,透過作者精心設計的範例與練習,相信各位就可以在最短的時間內,瞭解如何應用LINQ查詢語法存取程式所需要的資料。

第13章 結合WF開發WPF應用程式應用程式的開發,目前已進入以流程為主的時代。本章將教導你如何使用Visual Studio 2010開發以工作流程為設計架構的應用程式。結合Windows Workflow Foundation (WF) 的架構,可以大大節省程式開發及維護的時間。

導讀

C-前段-完稿.indd 10 2010/7/13 上午 10:18:14

Page 4: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰

xi

第14章 結合WCF開發WPF應用程式.NET Framework 4平台中,另外一個重要的架構就是Windows Communication Foundation (WCF)。透過WCF的支援,C#應用程式就可以很容易與企業級元件或是遠端網路服務溝通。本章介紹在C#應用程式中使用WCF架構的方法,同時也介紹如何在WF工作流程中,透過WCF整合遠端元件功能。

第15章 使用UML建立專案模型UML(Unified Modeling Language) 是軟體設計最常使用的塑模語言,在Visual Studio 2010開發工具中,提供了「模型專案」的範本,可以協助開發人員快速建立專案所需要的UML模型。本章將為各位介紹UML常用的基本模型圖,以及這些模型圖的使用方式;另外,也將介紹如何透過Visual Studio 2010開發工具的塑模專案建立UML的模型,然後根據UML模型建立專案中的元件。

範例程式下載

本書範例程式請至悅知網站下載:

http://www.delightpress.com.tw/book.aspx?book_id=SKNP00020

C-前段-完稿.indd 11 2010/7/13 上午 10:18:14

Page 5: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Chapter 14

結合WCF開發WPF應用程式

C-14-完稿.indd 405 2010/7/13 上午 10:55:44

Page 6: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰406

在以服務為導向的架構(Service Oriented Architecture;SOA)當中,應用程式可

以利用既有的服務,建立新的功能之後,再提供給其他的應用程式使用。在這樣

的前提之下,應用程式必須要具備可以隨時繫結到不同節點的服務能力。為了要

讓.NET平台的應用程式具備這樣的能力,因此,.NET Framework提供了Windows

Communication Foundation (WCF) 的基礎架構,幫助開發人員可以讓應用程式快

速存取外界服務端點的功能。

在本章中,將介紹如何將Windows Communication Foundation應用在新一代的應用

程式架構中,包括:

建立服務端點 ■

使用服務端點 ■

結合WF開發工作流程服務 ■

14-01 Windows Communication Foundation簡介

Windows Communication Foundation (WCF) 架構為.NET Framework中,用來幫助

應用程式繫結服務端點功能的服務。透過WCF架構所提供的支援,無論你是要建

立分享給其他應用程式使用的服務,或是要存取已經存在的服務,都可以使用簡

單的開發步驟完成。除此之外,WCF也支援多種通信協定的不同溝通模式,因

此也具備跨平台整合的能力。當然,WCF也可以整合到《第13章:結合WF開發

WPF應用程式》所介紹的WF架構當中。所以,你就能輕鬆的在工作流程中,存

取既有的服務元件的功能,甚至也可以將建立工作流程服務服務,供其他應用程

式使用。

14-1-1 WCF的架構概念 ❙其實在分散式架構中,企業級元件很早就有集中共用的概念,在.NET平台出現

之前,就可以使用Windows作業系統中的元件服務(Component Service),透過

DCOM通信協定使用分散式元件①。.NET平台推出之後,企業級元件的執行架構

① 在Java平台中,對應的技術叫做EJB (Enterprise Java Bean)。

C-14-完稿.indd 406 2010/7/13 上午 10:55:45

Page 7: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 407

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

也跟著從以往的企業內網結構(以TCP/IP協定為基礎),走向以網路服務(Web

Service)為基礎的網際網路結構(以Http協定為基礎)。和從前最大不同的地方

在於,網際網路結構是因為透過Http通信協定溝通,因此沒有執行平台的限制,

建立好的服務元件可以跨不同的平台使用。對於企業級應用程式而言,使用這種

以服務為導向(SOA)的架構發展出來的服務元件,將來就可以使用在各種不同

技術開發的應用程式當中,以減輕應用程式開發與維護的成本。圖14-1即為SOA

架構的基本概念,用戶端只需存取在網際網路中的服務元件,即可執行複雜的運

算,或是使用遠端資料庫中的資料:

圖14-1:以服務為導向的應用程式發展架構

除此之外,目前網際網路應用程式的發展,也已經開始跳脫出瀏覽器的框架,開

始與用戶端的應用程式整合。這是因為在傳統的瀏覽器存取網際網路應用程式的

架構當中,用戶端僅能使用HTML和JavaScript建立使用者操作介面,若是要讓用

戶端執行較複雜的功能(例如:編修圖片)、或是離線繼續操作等動作時,開發

與維護都相當不方便。因此,透過新的應用程式發展架構,網際網路應用程式也

可以將一些功能,製作成網路服務元件,如此一來,用戶端的應用程式即可直接

使用這些功能。

C-14-完稿.indd 407 2010/7/13 上午 10:55:45

Page 8: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰408

圖14-2:新一代Web應用程式發展架構

為了滿足這些新一代應用程式對於網際網路的需求,微軟在.NET Framework 1.0

中,就已經加入對於網路服務的支援。除此之外,.NET Framework 1.0中,也建

立了Remoting的架構,以滿足企業級元件的溝通需求。但是,隨著SOA的發展與

應用越來越廣,服務元件的建立方式也趨於多元化,為了滿足SOA架構發展的需

求,同時簡化維護與存取服務元件所需要的程式碼,於是微軟在.NET Framework

中,將這些技術整合成Windows Communication Foundation (WCF) 架構。

在WCF的架構下,無論你是要建立服務,或是需要存取服務,只需要提供關於服

務的三件資訊②,WCF就可以幫助你發佈或是繫結服務:

服務的存取位置(Address) ■

服務的繫結方式(Binding) ■

服務的合約內容(Contract) ■ ③

如此一來,就不需要為發佈服務元件或是繫結服務元件而開發一堆程式碼,只需

要服務端與用戶端的設定(ABC)都相同,.NET平台底層中的WCF服務就會自動

溝通,參考圖14-3:

② 也可以稱為「服務的ABC (Address、Binding、Contract)」

③ 這部分稍後會做介紹。

C-14-完稿.indd 408 2010/7/13 上午 10:55:45

Page 9: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 409

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

圖14-3:使用WCF架構

同時,在Visual Studio 2010開發工具中,為了幫助你快速建立支援WCF架構的應

用程式,提供了許多方便的工具。接下來,學習如何透過Visual Studio 2010開發

工具,建立與使用支援WCF架構的服務。

14-1-2 建立服務 ❙要建立支援WCF架構的服務元件,首先,你可以使用Visual Studio 2010開發工具

所提供的WCF專案範本。當你從功能表選取「檔案」→「新增」→「專案」,開

啟「新增專案」視窗時,就可以從「WCF」專案類型中,選取「WCF服務程式

庫」專案範本。

圖14-4:建立WCF服務程式庫專案

C-14-完稿.indd 409 2010/7/13 上午 10:55:45

Page 10: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰410

專案建立完成之後,Visual Studio 2010開發工具會自動在專案中加入兩個程式原

始檔:IService1.cs與Service1.cs,除此之外,Visual Studio 2010開發工具也會自動

在專案中,建立應用程式組態檔App.Config,這些都是用來建立WCF服務所需要

的基本環境。

建立支援WCF架構的服務元件,第一個步驟,就是要先使用應用程式介面,定義

出服務合約(Contract)的規格。WCF基本的合約分成三種:

ServiceContract:用來宣告服務端點(套用在介面宣告前)。 ■

OperationContract:用來宣告服務功能(套用在介面方法前)。 ■

DataContract:用來宣告服務功能執行時,所傳遞的資料規格(套用在類別宣 ■

告前)。

為了方便在程式碼中宣告服務所需要的合約,因此,WCF將這些合約定義成了屬

性標記④,你只需要在定義服務介面規格時加上屬性標記,就可以宣告這一些合

約的內容。例如,要定義一個可以計算加減乘除功能的計算機服務之前,必須要

先定義介面宣告其規格:

public interface ICalculator { double Add(double n1, double n2); double Subtract(double n1, double n2); double Multiply(double n1, double n2); double Divide(double n1, double n2); }

接著,在定義服務規格的介面宣告中,加上屬性標記,宣告ServiceContract與

OperationContract:

using System.ServiceModel;

[ServiceContract]public interface ICalculator{ [OperationContract] double Add(double n1, double n2); [OperationContract]

④ 這一些屬性標記定義在System.ServiceModel命名空間中。

C-14-完稿.indd 410 2010/7/13 上午 10:55:45

Page 11: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 411

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2);}

因為將來在根據這個介面所建立的服務元件,服務端與用戶端只會交換字串格式

的資料,因此,我們無需另外再建立DataContract,即可根據這個介面規格建立服

務元件:

public class CalculatorService : ICalculator{ #region ICalculator 成員 public double Add(double n1, double n2) { return n1 + n2; } public double Subtract(double n1, double n2) { return n1 - n2; } public double Multiply(double n1, double n2) { return n1 * n2; } public double Divide(double n1, double n2) { return n1 / n2; } #endregion }

而若是服務端與用戶端需要交換物件型別資料的話,必須要在物件類別的定義

中,使用DataContract屬性標記將物件類別加入需要傳遞的資料合約規格中,並且

使用DataMember屬性標記宣告要透過序列化動作傳遞的物件成員。例如,透過下

列的資料合約的宣告,將來就可以在服務中傳遞Employee物件資料:

// 使用以下資料合約,新增Employee型別至服務作業 [DataContract]public class Employee{ string empid = "Not Set";

C-14-完稿.indd 411 2010/7/13 上午 10:55:46

Page 12: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰412

string empname = "Not Set";

[DataMember] public string EmpID { get { return empid; } set { empid = value; } }

[DataMember] public string empname { get { return empname; } set { empname = value; } }}

14-1-3 設定WCF服務位置與繫結 ❙服務元件建立完成之後,接下來,就是要設定服務的位置(Address)與繫結

(Binding)資訊。Visual Studio 2010開發工具中,為了減化這一些設定的動作,

提供了「WCF服務組態編輯器」工具,你只需要在WCF服務程式庫專案的「方案

總管」視窗中,選取App.config組態檔,按下滑鼠右鍵選取「編輯 WCF 組態」項

目,如圖14-5,就可以開啟這個工具。

圖14-5:啟動WCF組態設定工具

WCF組態設定工具同時可以進行服務端與用戶端的設定,服務端的設定建立在服

務的節點之下;而用戶端的設定則是設定在Client的節點之下:

C-14-完稿.indd 412 2010/7/13 上午 10:55:46

Page 13: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 413

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

圖14-6:服務端與用戶端的WCF設定位置

WCF組態設定工具開啟之後,可以按照以下步驟建立服務端組態設定:

步驟一:新增服務宣告

在「服務」節點上按下滑鼠右鍵,選取「新增服務」,即可增加服務節點。按下

Name屬性旁的 按鈕,從專案的bin\Debug目錄下,選取專案組件,開啟要註冊

的服務元件型別,然後按下「開啟」按鈕,參考圖14-7:

圖14-7:選取服務元件型別

C-14-完稿.indd 413 2010/7/13 上午 10:55:46

Page 14: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰414

步驟二:設定基底位置

WCF架構下的服務位置的設定方式相當彈性,你可以為每個與服務相關聯的端

點(Endpoint)指定絕對位址,或是為服務的ServiceHost提供基底位置(Base

Address),然後指定相對於此基底位址所定義之服務相關聯的每個端點位址。若

是要指定基底位置的話,請選取新增的服務節點下的「主機」節點,然後選取右

下角的「新增」按鈕,就可以新增基底節點的位置。

1

2

圖14-8:建立新的基底節點位置

在開發的環境中,你可以先輸入一個本機端的測試位置,以方便稍後透過工具進

行測試,像是:

http://localhost:1117/Ch16Sample/Calculator

步驟三:設定服務端點

服務元件被存取的位置,就叫做服務端點(Endpoint)。在WCF架構中,一個服

務可以同時對應多個不同的端點,而每個服務端點都可以有不同的存取方式設

定,像是通信協定、驗證方式等。要新增服務端點的設定的話,只需要選取WCF

組態設定工具服務節點下的「端點」資料夾,按下滑鼠右鍵,選取「新增服務端

點」,就可以新增服務端點定義。

新增服務端點定義之後,有三個一定要設定的屬性:

C-14-完稿.indd 414 2010/7/13 上午 10:55:46

Page 15: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 415

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

Address:服務端點的位置,可以指定絕對位置或是參考基底位置的相對位置。 ■

Binding:服務端點繫結的方式,設定服務端點所要使用的通信協定。 ■

Contract:服務端點所要提供的服務合約。 ■

在WCF架構當中,提供多種通信協定傳輸的支援,你可以建立不同的服務端點,

提供多種不同協定的繫結設定。WCF支援的繫結與支援的通訊協定設定,如表

14-1:

WCF繫結 可與其互通的通訊協定或技術

BasicHttpBinding 與WS-Basic Profile相容之Web服務通訊,例如,以ASP.NET Web Service (.ASMX) 為基礎的服務。

WSHttpBinding WS,非雙工服務。

WS2007HttpBinding 與W S H t t p B i n d i n g類似,但是在可靠的工作階段(ReliableSession)、安全性以及交易流程部分,是採用OASIS制定的標準。

WSDualHttpBinding WS,雙工服務。

WSFederationHttpBinding 安全、互通且支援WS-Federation通訊協定。

WS2007FederationHttpBinding 衍生自WS2007HttpBinding,採用的是OASIS制定的標準。

NetTcpBinding TCP/IP,適用於WCF應用程式之間的跨電腦通訊。

NetNamedPipeBinding NamePipe,適用於WCF應用程式之間的跨電腦通訊。

NetMsmqBinding 佇列繫結,適用於WCF應用程式之間的跨電腦通訊。

NetPeerTcpBinding 多電腦通訊的對等(Peer to Peer)繫結。

WebHttpBinding 建立支援透過Http要求存取,而非使用SOAP訊息的繫結 端點。

MsmqIntegrationBinding 適用於WCF應用程式與現有訊息佇列應用程式之間的跨電腦通訊。

表14-1:WCF支援的繫結與支援的協定設定

若是服務元件需要相容於.NET Framework 1.0、2.0的應用程式存取的話,Binding

屬性必須要選擇「BaiscHttpBinding」,若是需要支援新的ws-* 通信協定的話,就

必須要選擇WSHttpBinding或是WSDualHttpBinding。

C-14-完稿.indd 415 2010/7/13 上午 10:55:47

Page 16: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰416

步驟四:設定服務行為

若要使用Visual Studio 2010開發工具測試服務的功能,必須設定服務行為

(Service Behavior),發行服務的中繼資料(Metadata),讓測試工具可以建立

測試環境。建立的方式如下:

1. 選取WCF組態設定工具中的「進階」→「服務行為」節點,按下滑鼠右鍵,

選取「新增服務行為組態」。

2. 設定新增加的服務行為名稱,然後按下方的「新增」按鈕。在開啟的對話方

塊中選取「serviceMetadata」項目,然後按下「新增」按鈕,將此項目加入服

務行為中,如圖14-9所示:

1

2

圖14-9:將發行中繼資料設定加入服務行為中

3. 接著,用滑鼠雙擊serviceMetadata項目,將「HttpGetEnabled」屬性值設為

True,如圖14-10所示:

圖14-10:允取透過Http Get方法取得服務中繼資料

C-14-完稿.indd 416 2010/7/13 上午 10:55:47

Page 17: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 417

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

4. 最後,在WCF組態設定工具中,在「Service」節點下選取新加入的服務節

點,然後將BehaviorConfiguration屬性值設為Step02所建立的服務行為即可,

參考圖14-11:

圖14-11:設定服務要套用的的服務行為設定

完成以上設定之後,即可選取WCF組態設定工具功能選單的「檔案」→「儲

存」,將設定存回App.config組態檔,然後選取「檔案」→「結束」,關閉組態

設定工具。

14-1-4 測試WCF服務 ❙完成以上設定之後,就能直接使用Visual Studio 2010開發工具所提供的測試工

具,測試所建立的WCF服務。你可以在Visual Studio 2010開發工具中,像一般專

案測試一樣按下【F5】鍵,此時,Visual Studio 2010開發工具就會啟動WCF服務

主機(WcfSvcHost.exe),自動裝載並測試已實作的WCF服務。當WCF服務主機

啟動時,會在開發環境的佇列中(一般在右下角),看到如圖14-12的提示訊息:

圖14-12:啟動WCF服務主機的提示訊息

一般必須要先裝載服務到主應用程式,並建立用戶端程式,才可以測試WCF服務

端的功能;但透過Visual Studio 2010所提供的WCF服務主機及WCF測試用戶端工

具(WcfTestClient.exe),就能在服務開發完成之後,直接測試服務的功能。當

WCF服務主機裝載服務完成之後,會自動開啟WCF測試用戶端工具,若是專案中

C-14-完稿.indd 417 2010/7/13 上午 10:55:47

Page 18: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰418

的服務有發行中繼資料的話,WCF測試用戶端工具會自動建立測試的操作介面,

如圖14-13:

圖14-13:使用WCF測試用戶端工具

只需要用滑鼠雙擊要測試的方法,WCF測試用戶端就會建立測試的介面讓你輸入

資料,再按下「叫用」按鈕即可進行測試。

14-1-5 裝載WCF服務 ❙當WCF服務的功能測試成功之後,就可以發行服務了。一般可以使用下列任一種

方式裝載WCF服務執行。

使用.NET應用程式

WCF服務可以裝載於任何.NET應用程式中執行,當然這是最彈性的選項,因為

它只需要最少的環境設定就可部署。你可以將服務的程式碼或組件定義加入.NET

應用程式程式碼中,然後藉由建立並開啟ServiceHost的物件實體提供服務。在

ServiceHost物件建立時,必須要指定裝載的服務型別,參考程式碼如下:

ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))

ServiceHost物件提供了Open、Close方法,讓你可以隨時啟動,或是停止裝載在

ServiceHost物件中的服務。需要注意的是,服務需執行在try...catch程式碼區塊

中,讓程式可以捕捉並處理服務執行時發生的例外狀況,參考程式碼如下:

C-14-完稿.indd 418 2010/7/13 上午 10:55:47

Page 19: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 419

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

try{ serviceHost.Open(); //其他程式碼 serviceHost.Close();}catch(Exception e){ //錯誤處理程式}

另外,WCF服務的組態設定必須要加入應用程式的組態檔中。你可以將WCF服

務專案中的App.config組態檔的內容複製到裝載服務應用程式的組態檔中,或是

在裝載服務應用程式專案中,選取Visual Studio 2010功能表的「工具」→「WCF

Service Configuration Editor」選項,啟動WCF服務組態設定工具直接編輯應用程

式的組態檔。

使用Windows Service

若是常駐型的服務,你也可以直接建立Windows Service專案,將ServiceHost物件

透過覆寫的OnStart方法來建立並開啟,或是透過覆寫的OnStop方法加以關閉。再

透過自訂的安裝類別(Installer)安裝在作業系統中,將來就可以透過作業系統的

服務管理員啟動或是關閉服務。

使用網際網路資訊服務 (IIS)

使用IIS裝載選項將會與ASP.NET執行環境整合,並使用這些技術所提供的功能,

例如,處理序回收、閒置關機、處理序健康狀態監控,以及訊息啟動。但請注

意,IIS裝載的服務只能使用HTTP通信協定。當WCF服務透過IIS來裝載時,可

以在其他Web應用程式相同的AppDomain、應用程式集區、背景工作處理序中執

行。

若是要發行到IIS中,除了必須建立服務之外,也要另外建立包含.svc副檔名的新

檔案,svc服務檔中使用@ServiceHost指示詞描述服務的資訊,參考內容如下:

<%@ServiceHost language=c# Service=" CalculatorService"%>

同時,你也必須把WCF服務的組態設定加入應用程式目錄下的web.config組態檔

中:

C-14-完稿.indd 419 2010/7/13 上午 10:55:48

Page 20: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰420

<system.serviceModel> <service behaviorConfiguration="CalculatorBehavior" name="Service.CalculatorService"> <endpoint binding="basicHttpBinding" contract="Service.ICalculator" /> <host> <baseAddresses> <add baseAddress="http://localhost:1117/Ch16Sample/Calculator" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="CalculatorBehavior"> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>

使用Windows Process Activation Service (WAS)

Windows Process Activation Service (WAS) 是Windows Server 2008及Windows Vista

上全新的處理序啟動機制(也提供此機制),包含IIS 6.0 處理序模型和裝載功

能,但是從啟動架構中移除對HTTP的相依性。WAS這項新的處理序啟動服務整

合了所有搭配使用非HTTP傳輸通訊協定的網際網路資訊服務(IIS)功能,同時

在IIS 7.0中透過WAS完成透過HTTP的訊息啟動。其他WCF元件也可外掛至WAS

以提供WCF所支援的其他通訊協定(例如:TCP、MSMQ,與具名管道)的訊息

啟動。如此便可讓使用其他通訊協定的應用程式使用IIS功能,例如,處理序回

收、快速故障防護等。

使用WAS裝載服務的設定方式跟發行至IIS是一樣的,差別是可以在組態中建立非

Http通信協定的端點。

Practice 14-1 建立及裝載WCF服務

開發一個提供加、減、乘、除功能的服務元件,供用戶端程式使用。

步驟一:新增專案

1. 開啟Visual Studio 2010開發工具。

C-14-完稿.indd 420 2010/7/13 上午 10:55:48

Page 21: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 421

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

2. 從功能表選單中選取「檔案」→「新增」→「專案」,然後選取「WCF」專

案類型,選擇「WCF服務程式庫」範本。接下來設定專案「位置」為範例安

裝目錄\ Practices\Ex14_01\starter,「名稱」為MyServiceLib,「方案名稱」

設為Practice14,參考圖14-14,然後按下「確定」按鈕:

1

2

3

圖14-14:Practice 14-1的專案設定

3. 專案開啟之後,從「方案總管」視窗中刪除預設加入的Service1.cs、IService1.

cs程式檔。

步驟二:建立WCF服務

要建立WCF服務,必須要先定義服務介面與服務合約規格,再根據介面實作出服

務元件。

1. 在「方案總管」視窗中,選取MyServiceLib專案,按下滑鼠右鍵,選取「加

入」→「新增項目」,在「加入新項目」視窗中,選取「一般」分類中的

「類別圖表」範本,將「名稱」設為MyClassDiagram.cd之後,按下「加入」

按鈕。

2. MyClassDiagram類別圖中,按下滑鼠右鍵選取「加入」→「介面」,在「新

增介面」視窗中,將「介面名稱」設為ICalculatorService,然後按下「確

定」按鈕。

C-14-完稿.indd 421 2010/7/13 上午 10:55:48

Page 22: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰422

3. 選取ICalculatorService介面圖示,按下滑鼠右鍵選取「加入」→「方法」,將

新方法命名為Add。

4. 選取Add方法,按下滑鼠右鍵,選取「類別細節」,在「類別細節」視窗中,

加入num1、num2兩個double型別參數到Add方法中,並且將Add方法的回傳值

型別也設為double,如圖14-15所示:

圖14-15:完成的Add方法設定

5. 重複Step03~04,於ICalculatorService介面中再加入Subtract、Multiply及Divide

方法,每個方法都接收兩個double型別參數,並回傳double型別資料⑤。完成

的ICalculatorService介面圖示,如圖14-16:

圖14-16:ICalculator介面規格

6. 選取ICalculatorService介面圖示,按下滑鼠右鍵,選取「檢視程式碼」,在程

式碼前面加入引用System.ServiceModel命名空間的宣告:

using System.ServiceModel;

7. 在ICalculatorService介面宣告前,加上[ServiceContract]屬性標記。

⑤ 也可以直接使用「類別細節」視窗完成這些動作。

C-14-完稿.indd 422 2010/7/13 上午 10:55:49

Page 23: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 423

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

8. 在ICalculatorService介面中的Add、Subtract、Multiply、Divide方法前,加上

[OperationContract]屬性標記。完成的ICalculatorService介面程式碼如下:

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

namespace MyServiceLib{ [ServiceContract] public interface ICalculatorService { [OperationContract] double Add(double num1, double num2); [OperationContract] double Subtract(double num1, double num2); [OperationContract] double Multiply(double num1, double num2); [OperationContract] double Divide(double num1, double num2); }}

9. 開啟MyClassDiagram類別圖中,按下滑鼠右鍵,選取「加入」→「類別」,

在「新增類別」視窗中,將「類別名稱」設為CalculatorService,然後按下

「確定」按鈕。

10. 從「工具箱」中選取「繼承」項目,然後點選CalculatorService類別圖

示,拖曳到ICalculatorService介面圖示,宣告CalculatorService類別實作

ICalculatorService介面。完成的類別圖如圖14-17:

圖14-17:完成的MyClassDiagram類別圖

C-14-完稿.indd 423 2010/7/13 上午 10:55:49

Page 24: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰424

11. 選取CalculatorService類別圖示,按下滑鼠右鍵,選取「檢視程式碼」。在

CalculatorService類別中加入加、減、乘、除功能,程式碼如下:

public double Add(double num1, double num2){ return num1 + num2;}public double Subtract(double num1, double num2){ return num1 - num2;}public double Multiply(double num1, double num2){ return num1 * num2;}public double Divide(double num1, double num2){ return num1 / num2;}

步驟三:設定WCF服務組態

1. 在「方案總管」視窗中,選取MyServiceLib專案下的App.config組態檔,按下

滑鼠右鍵選取「編輯WCF組態」,開啟WCF服務組態設定工具。

2. 在「組態」面板中,先點選預設的「MyServiceLib.Service1」節點,按下滑鼠

右鍵,選取「刪除服務」,然後按下對話方塊中的「確定」按鈕。

3. 在「Configuration」面板中,選取「服務」節點,按下滑鼠右鍵選取「新增服

務」。

4. 選取右邊「服務:NewServiceType」面板中,「Name」屬性右邊的 按鈕,

開啟「服務型別瀏覽器」視窗。

5. 在「服務型別瀏覽器」視窗中,選取專案目錄下的bin\Debug子目錄中的

MyServiceLib.dll組件中的MyServiceLib.CalculatorService服務型別,然後按下

「Open」按鈕,如圖14-18所示:

C-14-完稿.indd 424 2010/7/13 上午 10:55:49

Page 25: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 425

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

圖14-18:選取WCF服務類型

6. 接下來,在「組態」面板中,選取「MyServiceLib.CalculatorService」下的

「主機」節點。接著點選右邊的「主機」面板下方的「新增」按鈕,如圖

14-19:

圖14-19:新增基底位置

C-14-完稿.indd 425 2010/7/13 上午 10:55:49

Page 26: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰426

7. 在開啟的「基底位置編輯器」視窗中,輸入以下位址,然後按下「確定」按

鈕:

http://localhost:1117/WCFSample/

8. 在「組態」面板中,選取「MyServiceLib.CalculatorService」下的「端點」節

點,按下滑鼠右鍵選取「新增服務端點」。

9. 在右邊的「服務端點」面板中,選取Contract屬性旁的 按鈕,開啟「合約

類型瀏覽器」視窗。

10. 在「合約類型瀏覽器」視窗中,選取專案目錄下的bin\Debug子目錄中的

MyServiceLib.dll組件中的MyServiceLib.ICalculatorService服務合約,然後按下

「開啟」按鈕,如圖14-20所示:

圖14-20:選取WCF服務合約

11. 在「組態」面板中,選取「M y S e r v i c e L i b . C a l c u l a t o r S e r v i c e」節

點,在右邊的「服務 : MyServiceLib .Calcula torService」面板中,將

「BehaviorConfiguration」屬性的值設為MyServiceLib.Service1.Behavior⑥。

⑥ 這是WCF服務程式庫專案新增時自動建立的服務行為,裡面已經加入發行中繼資料的設定,所以可以直接引用。

C-14-完稿.indd 426 2010/7/13 上午 10:55:50

Page 27: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 427

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

12. 在WCF服務組態設定工具的功能表選單中,先選取「檔案」→「儲存」;然

後再選取「檔案」→「結束」,關閉WCF服務組態設定工具。

步驟三:建立裝載應用程式

在此將建立一個WPF表單專案負責啟動及停止服務。

1. 選取Visual Studio 2010開發工具功能表選單中的「檔案」→「加入」→「新增

專案」,選取「Windows」專案範本中的「WPF應用程式」,在「名稱」中

輸入CalculatorServiceHost,然後按下「確定」按鈕,將專案加入解決方案

中。

2. 在「方案總管」視窗中,選取CalculatorServiceHost專案,按下滑鼠右鍵,

選取「加入參考」。在「加入參考」視窗中,選取「.NET」中的System.

ServiceModel組件,然後按下「確定」按鈕。

3. 在「方案總管」視窗中,選取CalculatorServiceHost專案,按下滑鼠右

鍵選取「加入參考」。在「加入參考」視窗中,選取「專案」頁籤中的

MyServiiceLib組件,然後按下「確定」按鈕。

4. 在「方案總管」視窗中,選取CalculatorServiceHost專案下的MainWindow.

xaml原始檔,按下滑鼠右鍵,選取「檢視程式碼」。

5. 在程式碼中加入引用System.ServiceModel命名空間的宣告如下:

using System.ServiceModel;

6. 在MainWindow類別中,宣告一個名為calhost的ServiceHost型別欄位:

private ServiceHost calhost;

7. 切換到設計模式,然後從「工具箱」中拖放兩個Button控制項到MainWindow

表單中,分別設定上面的文字為「啟動服務」與「停止服務」,如圖14-21:

C-14-完稿.indd 427 2010/7/13 上午 10:55:50

Page 28: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰428

圖14-21:Form1表單內容

8. 用滑鼠雙擊「啟動服務」按鈕,在Click事件處理常式中加入程式碼建立裝載

CalculatorService服務的ServiceHost實體,並且啟動服務端點:

private void button1_Click(object sender, RoutedEventArgs e){ try { calhost = new ServiceHost(typeof(MyServiceLib.CalculatorService)); calhost.Open(); MessageBox.Show("服務已啟動!"); } catch (Exception err) { MessageBox.Show("服務開啟失敗!"); Console.WriteLine(err.ToString()); }}

9. 回到設計模式中,用滑鼠雙擊「停止服務」按鈕,在Click事件處理常式中加

入下列程式碼:

private void button2_Click(object sender, RoutedEventArgs e){ try { calhost.Close(); MessageBox.Show("服務已結束!"); } catch (Exception err) {

C-14-完稿.indd 428 2010/7/13 上午 10:55:50

Page 29: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 429

09

14

10

12

15

13

14-01

Window

s Com

munication Foundation

簡介

11

MessageBox.Show("服務關閉失敗!"); Console.WriteLine(err.ToString()); }}

10. 在「方案總管」視窗中,選取MyServiceLib專案下的App.config組態檔,複製

到CalculatorServiceHost專案中。

11. 在「方案總管」視窗中,選取CalculatorServiceHost專案,按下滑鼠右鍵,選

取「建置」。

12. 在「方案總管」視窗中,選取MyServiceLib專案,按下滑鼠右鍵選取「卸載

專案」⑦。

13. 按下【F5】鍵,啟動CalculatorServiceHost專案。按下MainWindow表單中的

「啟動服務」按鈕。當顯示「服務已啟動」的訊息視窗出現⑧,按下「確定」

按鈕關閉訊息視窗。

14. 開啟瀏覽器,在網址列輸入服務的Http端點位置:

http://localhost:1117/WCFSample/

此時,會出現如圖14-22的CalculatorService服務說明網頁:

⑦ 若是兩個專案同時啟動,會註冊到相同的服務端點位置,因此先卸載WCF服務程式庫,單獨測試裝載服務的Windows應用程式。

⑧ 因為裝載這個服務時,必須要有管理者的權限才可以執行;因此,如果你在Windows 7作業系統環境中執行時,出現「服務開啟失敗!」的訊息時,請先關閉Visual Studio開發工具之後,再使用系統管理員身分重新開啟Visual Studio開發工具,然後再重新執行專案即可。

C-14-完稿.indd 429 2010/7/13 上午 10:55:50

Page 30: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰430

圖14-22:WCF服務的說明頁

點選網頁中的連結,就會出現CalculatorService服務的WSDL文件⑨,如圖

14-23:

⑨ 因為CalculatorService服務繫結方式是設為basicHttpBinding,所以當服務啟動之後,也可以直接使用.NET 1.0、2.0中的.ASMX網路服務的使用方式存取服務。

⑩ 如果還可以看得到的話,請先確認已關閉瀏覽器的網頁快取暫存功能,在關閉瀏覽器之後再重試一次。

C-14-完稿.indd 430 2010/7/13 上午 10:55:51

Page 31: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 431

09

14

10

12

15

13

14-02

建立W

CF

用戶端存取服務功能

11

圖14-23:CalculatorService的WSDL文件

15. 關閉瀏覽器。

16. 選取按下MainWindow表單中的「停止服務」按鈕。當顯示「服務已結束」的

訊息視窗出現,按下「確定」按鈕關閉訊息視窗。

17. 重複Step13的動作,你會發現已無法看到如圖14-22的CalculatorService服務說

明網頁⑩。

18. 關閉所有程式與瀏覽器,結束測試。

⑪ 建立用戶端類別時,並不會下載服務元件的程式邏輯,因此,當呼叫根據用戶端類別所建立的物件實體的功能時,用戶端元件會自動根據組態設定,存取遠端服務中的功能執行。

⑫ Visual Studio 2005中的「加入Web服務」的功能,也整合到這個工具當中。如果要存取.NET 1.0或是2.0中的網路服務,就使用這個工具就對了。

C-14-完稿.indd 431 2010/7/13 上午 10:55:51

Page 32: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰432

14-02 建立WCF用戶端存取服務功能

WCF服務裝載啟動完成之後,就可以開始建立用戶端程式存取服務的功能。

Visual Studio 2010開發工具整合了.NET Framework 4.0的架構,用戶端可以透過用

戶端元件或是工作流程存取服務。

14-2-1 建立用戶端元件存取服務 ❙在一般應用程式當中,若是需要存取服務元件的功能,我們可以先根據服務合約

的定義,建立用戶端的元件,再以用戶端的元件搭配.NET平台中的WCF架構來

使用遠端服務中的功能。為了方便在.NET程式中,建立WCF服務的用戶端的元

件,.NET Framework提供了一個名為svcutil.exe的工具程式,你可以直接使用這

個工具程式,根據WCF服務的中繼資料,建立存取服務元件所需要的用戶端類別

原始檔,以及組態設定檔:

svcutil.exe http://localhost:1117/WCFSample/?wsdl

執行完成後,再將這兩個檔案新增至用戶端應用程式,並使用產生的用戶端類別

建立物件實體,就可以使用用戶端元件呼叫遠端服務的功能⑪。

除此之外,Visual Studio 2010開發工具也在專案中新增了「加入服務參考」的功

能。若是在開發專案時,需要存取遠端服務元件的功能時,你也可以直接啟用這

個功能,在「加入服務參考」視窗中,輸入服務的位置,再按下「移至」按鈕,

如圖14-24,Visual Studio 2010開發工具就會自動根據服務的定義,建立用戶端類

別以及組態設定,你就可以直接在.NET專案中存取遠端服務元件的功能了⑫。

C-14-完稿.indd 432 2010/7/13 上午 10:55:51

Page 33: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 433

09

14

10

12

15

13

14-02

建立W

CF

用戶端存取服務功能

11

圖14-24:在專案中「加入服務參考」

Practice 14-2 使用遠端服務元件功能

在《Practice 14-1:建立及裝載WCF服務》中建立了一個提供加、減、乘、除計

算功能的CalculatorService服務元件,在本練習中,我們將在WPF表單專案中,建

立用戶端元件使用這一個服務的功能。

步驟一:啟動服務元件

1. 利用檔案總管,開啟範例安裝目錄\ Practices\Ex14_02\ServiceHost資料夾。

2. 以系統管理員身分執行CalculatorServiceHost.exe程式檔。

3. 按下MainWindow表單中的「啟動服務」按鈕。當顯示「服務已啟動」的訊息

視窗出現,按下「確定」按鈕關閉訊息視窗。

C-14-完稿.indd 433 2010/7/13 上午 10:55:51

Page 34: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰434

步驟二:開啟專案

1. 開啟Visual Studio 2010開發工具。

2. 開啟範例安裝目錄\ Practices\Ex14_02\solution\Practice14路徑下的

Practice14.sln專案檔。

步驟三:建立用戶端類別存取服務

1. 在「方案總管」視窗中,選取WCFClientSample專案,按下滑鼠右鍵,選擇

「加入服務參考」。

2. 在「加入服務參考」視窗的「位址」項目中,輸入服務的位址為:

http://localhost:1117/WCFSample/

然後按下「移至」按鈕,此時Visual Studio 2010會下載服務的合約規格,並將

服務的資訊顯示在「加入服務參考」視窗中,如圖14-25所示:

圖14-25:Visual Studio 2010下載的服務資訊

C-14-完稿.indd 434 2010/7/13 上午 10:55:51

Page 35: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 435

09

14

10

12

15

13

14-02

建立W

CF

用戶端存取服務功能

11

3. 展開「服務」面板中的CalculatorService

服務節點,選取底下的ICalculatorService

服務合約。然後在「命名空間」中輸入

WCFSample,按下「確定」按鈕。

4. 在Visual Studio 2010功能表選單中選取

「檢視」→「類別檢視」,從開啟的類別

檢視視窗中,你會發現到在專案中多了一

個名為WCFClientSample.WCFSample

的命名空間,而且在這個命名空間中建立

了一個CalculatorServiceClient的類別定

義⑬。CalculatorServiceClient就是在這一個

專案程式中,用來存取CalculatorService服

務所使用的用戶端類別,參考圖14-26。

5. 開啟「方案總管」視窗,你也會發現專案中多了新的ServiceReference節點,

以及app.config組態檔。在app.config組態檔中,會自動建立用戶端類別存取遠

端服務時所需要的WCF組態設定:

<?xml version="1.0" encoding="utf-8" ?><configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_ICalculatorService"       closeTimeout="00:01:00"    openTimeout="00:01:00" receiveTimeout="00:10:00"       sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false"        hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize=       "524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength=

圖14-26:WCFClientSample專案的 類別檢視

⑬ 如果再仔細檢視「類別檢視」視窗中的CalculatorServiceClient類別,會發現CalculatorServiceClient類別提供了Add、Subtract、Multiply、Divide的方法。

C-14-完稿.indd 435 2010/7/13 上午 10:55:52

Page 36: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

Visual C# 2010與 UML開發實戰436

       "8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:1117/WCFSample/" binding = "basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICalculatorService" contract="WCFSample.ICalculatorService" name= "Basic-HttpBinding _ICalculatorService" /> </client> </system.serviceModel></configuration>

跟服務端組態設定不同的地方在於,因為這是用戶端的設定,因此,服務端

點的位置、繫結,以及合約是定義在<client>的標籤中。

6. 在「方案總管」視窗中,選取WCFClientSample專案中的MainWindow.xaml原

始檔,按下滑鼠右鍵,選取「檢視程式碼」。

7. 從Visual Studio 2010功能表選單中選取「檢視」→「工作清單」,然後從「工

作清單」視窗的下拉選單中選取「註解」。

8. 在「工作清單」視窗中,用滑鼠雙擊「TODO: 1.宣告用戶端類別命名空間」

項目,並在註解文字下一行加入以下程式,宣告用戶端類別命名空間參考:

using WCFClientApp.WCFSample;

9. 在「工作清單」視窗中用滑鼠雙擊「TODO: 2.呼叫遠端服務功能」項目,並

在註解文字下一行加入程式建立用戶端類別實體,並根據下拉選單的選項呼

叫不同的遠端功能,執行計算動作。程式碼如下:

CalculatorServiceClient proxy = new CalculatorServiceClient();switch (comboBox1.SelectedIndex) { case 0:

C-14-完稿.indd 436 2010/7/13 上午 10:55:52

Page 37: 第一篇 Visual C#程式基礎與WPF應用程式 · PDF file第12章 LINQ C# 程式語言中,Language-Integrated Query (LINQ)

CHAPTER 14 結合WCF開發WPF應用程式 437

09

14

10

12

15

13

14-02

建立W

CF

用戶端存取服務功能

11

result = proxy.Add(num1, num2); break; case 1: result = proxy.Subtract(num1, num2); break; case 2: result = proxy.Multiply(num1, num2); break; case 3: result = proxy.Divide(num1, num2); break;}

10. 按下【F5】鍵,建置並執行WCFClientSample專案。在Windows表單的文字輸

入方塊中輸入數字,再從下拉選單中選取運算元,然後按下「=」按鈕,程式

將會透過遠端服務自動執行計算動作,並顯示回傳的結果,如圖14-27:

圖14-27:Practice 14-2的執行結果

你也可以試著按下裝載WCF服務的MainWindow表單上的「停止服務」按鈕,停

止CalculatorService服務,此時,會發現WCFClientSample專案的程式就無法正常

執行,程式將會擲出EndpointNotFound的例外狀況。

14-2-2 在WF工作流程中使用WCF遠端服務 ❙若是需要在WF工作流程中存取遠端的WCF服務,做法其實和建立用戶端元件一

樣簡單。當你在WF工作流程專案裡加入服務參考時,Visual Studio開發工具會自

動建立一個用來存取遠端WCF服務的活動,並且顯示在工具箱。所以,你只需要

將該活動從工具箱加入工作流程當中,就可以使用WCF服務的功能了!

C-14-完稿.indd 437 2010/7/13 上午 10:55:52