最近需要用到WCF,所以對WCF進行瞭解。在實踐中學習新知識是最快的,接下來先做了一個簡單的WCF服用應用示例。 本文的WCF服務應用功能很簡單,卻涵蓋了一個完整WCF應用的基本結構。希望本文能對那些準備開始學習WCF的初學者提供一些幫助。 在這個例子中,我將實現一個簡單的書籍數據查詢功能(Book...
最近需要用到WCF,所以對WCF進行瞭解。在實踐中學習新知識是最快的,接下來先做了一個簡單的WCF服用應用示例。
本文的WCF服務應用功能很簡單,卻涵蓋了一個完整WCF應用的基本結構。希望本文能對那些準備開始學習WCF的初學者提供一些幫助。
在這個例子中,我將實現一個簡單的書籍數據查詢功能(BookService),即根據書籍ID去查詢對應書籍的信息,並顯示出來。和傳統的分散式通信框架一樣,WCF本質上提供一個跨進程、跨機器、跨網路的服務調用。在本例中,客戶端和WCF應用服務通過運行在同一臺機器上的不同進程模擬。如下圖。
WCF應用服務運行環境
WCF應用服務不能單獨存在,無法獨立運行,WCF應用服務需要寄宿於一個正在運行中的進程之內。我們把承載WCF應用服務的進程稱為宿主,為WCF應用服務指定宿主的過程稱為服務寄宿 (Service Hosting)。在我們的WCF應用服務程式中,通過自我寄宿(Self-Hosting)的方式創建一個控制台應用作為服務的宿主 (寄宿進程為Hosting.exe)。客戶端通過一個WindowsFrom應用程式(進程為WinClient.exe)去訪問WCF應用服務實現數據查詢功能。接下來,我們就一步一步來學習如何創建這樣的一個WCF應用。
第一步:創建SCF.WcfService解決方案
通過Visual Studio 2015創建一個名為“SCF.WcfService”空白的解決方案,添加如下五個項目。項目的類型、承載的功能和相互引用關係如下,整個項目在Visual Studio 2015中的結構如下圖所示。
SCF.WcfService的項目結構
- SCF.WcfService:一個類庫項目,提供對WCF服務的實現。引用關係見下圖。
- Hosting:一個控制台(Console)應用,實現對定義在SCF.WcfServices項目中的服務的寄宿。引用關係見下圖。
- SCF.Model:一個對象實體項目,實現對資料庫中的表結構進行實體對象構建。
- WinClient:一個控制台應用模擬服務的客戶端,該項目引用System.ServiceMode程式集。引用關係見下圖。
- SCF.Common:SCF. WcfService解決方案中公共使用的類
第二步:創建WCF服務協定
WCF採用基於介面(MSDN上翻譯為:服務協定)的交互方式實現了服務功能,以及客戶端和服務端之間的松耦合。WCF包含五種類型的協定:服務協定、操作協定、消息協定、錯誤協定和數據協定。
從功能上講,服務協定將多個相關的操作聯繫在一起,組成單個功能單元。協定可以定義服務級設置,如服務的命名空間、對應的回調協定以及其他此類設置,以及各種操作。
從消息交換的角度來講,服務協定則定義了基於服務調用的消息交換過程中, 請求消息和回覆消息的結構,以及採用的消息交換模式。
從使用編程語言的角度來講,協定是通過所選的編程語言創建一個介面,然後將 ServiceContractAttribute 屬性應用於該介面。通過實現該介面,可生成實際的服務代碼。
我們通過介面的形式定義服務協定。通過下麵的代碼,將介面IBookService定義成服務協定。WCF廣泛採用基於自定義特性(Custom Attribtue)的聲明式編程模式,我們通過在介面上應用System.ServiceModel.ServiceContractAttribute特性將一個介面定義成服務協定。在應用ServiceContractAttribute特性的同時,還可以指定服務協定的名稱和命名空間。
通過應用ServiceContractAttribute特性將介面定義成服務協定之後,介面的方法成員並不能自動成為服務的操作。在此方面,WCF採用的是顯式選擇(Explicit Opt-in)的策略:我們須要在相應的操作方法上面顯式地應用OperationContractAttribute特性。
在SCF.WcfService項目中添加一個IBookService.cs文件,具體代碼如下。
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace SCF.WcfService { // 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的介面名“IBookService”。 [ServiceContract] public interface IBookService { [OperationContract] string GetBook(string Id); } }
第三步:實現WCF服務協定
當服務協定成功創建時,我們需要通過實現服務協定來創建具體的WCF服務應用。在SCF.WcfServices項目中添加一個BookService.cs文件,此文件用來實現服務協定介面IBookService,實現所有的服務操作。BookService.cs中的代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.Data.Entity; using SCF.Model; using SCF.Common; namespace SCF.WcfService { // 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼、svc 和配置文件中的類名“BookService”。 // 註意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 BookService.svc 或 BookService.svc.cs,然後開始調試。 public class BookService : IBookService { public string GetBook(string Id) { int bookId = Convert.ToInt32(Id); Books book= SetBook(bookId); string xml=XMLHelper.ToXML<Books>(book); return xml; } public Books SetBook(int Id) { Books book = new Books(); book.BookID = Id; book.AuthorID = 1; book.Category = "IBM"; book.Price = 9.99M; book.Numberofcopies = 22; book.Name = "DB 2"; book.PublishDate = new DateTime(1986, 2, 23); return book; } } }