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
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
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
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
Chapter 14
結合WCF開發WPF應用程式
C-14-完稿.indd 405 2010/7/13 上午 10:55:44
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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