1.什么是WCF
Windows Communication Foundation(WCF)是一個面向服務(SOA)的通訊框架,作為.NET Framework 3.0的重要組成部分於2006年正式發布。WCF的使命是對Windows平台下現有的通訊技術(包括:COM、DCOM、.NET Remoting、Web Services、MSMQ、WinSocket)進行全面整合,並設計了一個統一的程序開發模型(API),對於數據通信提供了最基本最有彈性的支持。
2.WCF的體系結構
我們從下面WCF的體系結構圖可以看出WCF是Windows平台下通訊技術的集大成者:

3.WCF的寄宿
首先WCF應用程序是不能獨立存在的,它必須依附於(寄宿)於其他的應用程序(宿主)中,宿主進程是專為承載服務而設計的應用程序。這些宿主進程包括 Internet 信息服務 (IIS)、Windows 激活服務 (WAS) 和 Windows 服務、開發人員創建的應用程序。
4.WCF的HelloWorld
說千遍不如做一遍,下面我們通過一個簡單的示例程序來學習如何構建一個WCF程序,以便於對WCF編程建立一個初步的印象。我們創建一個計算器服務,實現簡單的加、減、乘、除的操作,然后由另一個進程(本地或遠程)來調用這個服務。
4.1,創建HelloWcfService解決方案。
首先我們創建一個名為:HelloWcfService解決方案,在該解決方案下創建一個Hosting的控制台項目;用於承載WCF服務。接着創建一個ContractService類庫項目,定於定於服務的契約(接口);再最后創建一個Service類庫項目,用於實現ContractService定義的服務契約(接口)。如下:

4.2,定義服務的契約(接口)
從字面上來理解,服務契約就是:服務所提供操作的一個抽象。服務契約指定了服務支持的操作,通過使用接口來創建契約,接口中的每個方法都應對與特定的服務操作,同時定義契約的接口必須應用ServiceContractAttribute特性,同時我們需要在接口中定義的方法應用OperationContractAttribute特性,否則不公開該方法。
我們在創建的解決方案中的ContractService類庫項目中引用System.ServiceModel程序集,並添加System.ServiceModel命名空間,接着創建一個用於定義服務契約的接口,代碼如下:
1 using System.ServiceModel; 2 3 namespace ContractService 4 { 5 [ServiceContract(Name = "CalculatorService", Namespace = "http://www.cnblogs.com/IPrograming")] 6 public interface ICalculator 7 { 8 [OperationContract] 9 double Add(double num1, double num2);//加法 10 [OperationContract] 11 double Subtract(double num1, double num2);//減法 12 [OperationContract] 13 double Multiply(double num1, double num2);//乘法 14 [OperationContract] 15 double Divide(double num1, double num2);//除法 16 } 17 }
4.3,實現服務契約(接口)
在前面我們只是對服務具有哪些操作進行一個抽象的定義,我們需要這個抽象的契約進行實現。在我們的這個例子中就是實現ICalculator接口。首先我們在Service的類庫項目添加對ContractService類庫項目的引用,並添加ContractService命名空間,然后實現ICalcultor接口,代碼如下:
1 using System; 2 using ContractService; 3 4 namespace Service 5 { 6 public class CalculatorService : ICalculator 7 { 8 #region ICalculator 成員 9 10 /// <summary>加法</summary> 11 public double Add(double num1, double num2) 12 { 13 return num1 + num2; 14 } 15 16 /// <summary>減法</summary> 17 public double Subtract(double num1, double num2) 18 { 19 return num1 - num2; 20 } 21 22 /// <summary>乘法</summary> 23 public double Multiply(double num1, double num2) 24 { 25 return num1 * num2; 26 } 27 28 /// <summary>除法</summary> 29 public double Divide(double num1, double num2) 30 { 31 return num1 / num2; 32 } 33 34 #endregion 35 } 36 }
4.4,承載(寄宿)和運行服務
通過前面我們知道WCF服務是無法獨立存在在,它必須是寄宿於其他的宿主(應用程序)中,寄宿服務的對象可以是開發人員自己創建的應用程序可以使用IIS和Windows服務等作為服務的宿主。在這里我們通過創建的控制台程序來作為服務的宿主。
在編寫借宿WCF服務的代碼前我們需要先了解幾個概念:
終結點:
WCF服務的所有通信是通過該服務的終結點進行的。 利用終結點,客戶端可訪問 WCF 服務提供的功能。終結點由三部分組成:
- 地址:地址唯一地標識終結點,並告訴服務的潛在客戶其所在的位置。
- 綁定:指定如何與終結點進行通信(包括使用的通信協議和消息編碼等)。
- 契約:契約抽象了服務的操作,公開了終結點向客戶端開放的功能。
元數據:
WCF 服務使用元數據來描述如何與服務終結點進行交互,以便工具(例如:Svcutil.exe)生成用於訪問服務的客戶端代碼。
在解決方案的Hosting項目中添加對System.ServiceModel程序集,Service項目以及ContractService類庫項目的引用,並添加相應的命名空間。代碼如下:
1 static void Main(string[] args) 2 { 3 //定義承載服務的類型和承載服務的基址 4 using (ServiceHost host = new ServiceHost(typeof(CalculatorService), new Uri("http://localhost:8889/CalculatorService"))) 5 { 6 //增加一個服務終結點 7 host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService"); 8 9 //使用元數據 10 ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); 11 //使用HTTP/GET請求 12 behavior.HttpGetEnabled = true; 13 //定義元數據發布地址 14 behavior.HttpGetUrl = new Uri("http://localhost:8889/CalculatorService/Metadata"); 15 //將元數據的定義添加到承載服務中 16 host.Description.Behaviors.Add(behavior); 17 18 // 啟動服務 19 host.Open(); 20 Console.WriteLine("CalculatorService服務運行中...\n"); 21 Console.WriteLine("按任意鍵退出."); 22 Console.Read(); 23 // 關閉服務 24 host.Close(); 25 } 26 }
運行宿主程序后,我們在瀏覽器中輸入下面的地址進行查看服務是否成功運行:
- 服務的地址:http://localhost:8889/CalculatorService
- 元數據的地址:http://localhost:8889/CalculatorService/Metadata

5.調用WCF服務
前面我們已經成功的創建一個可以用於基礎運算的WCF服務,我們創建一個HelloWcfClient控制台應用程序用來調用前面WCF提供的服務,我們通過這個服務發布的元數據來生成調用代碼(使用Svcutil.exe工具)Visual Studio可以為我們簡化這一過程:運行WCF服務的宿主程序后,為HelloWcfClient項目添加服務引用,服務的地址就是前面創建的元數據地址:http://localhost:8889/CalculatorService/Metadata ,Visual Studio會自動生成一系統服務調用的代碼和配置(這里暫時不做討論)。
只需要幾行代碼就可以完成服務的調用,調用代碼如下:
1 static void Main(string[] args) 2 { 3 using (CalculatorServiceClient proxy = new CalculatorServiceClient()) 4 { 5 Console.WriteLine("{0}+{1}={2}", 1, 2, proxy.Add(1, 2)); 6 Console.WriteLine("{0}-{1}={2}", 5, 2, proxy.Subtract(5, 2)); 7 Console.WriteLine("{0}*{1}={2}", 1, 2, proxy.Multiply(1, 2)); 8 Console.WriteLine("{0}/{1}={2}", 1, 2, proxy.Divide(1, 2)); 9 } 10 Console.Read(); 11 }
運行結果如下:

猛擊下載:示例程序
參考資料&進一步閱讀
Windows Communication Foundation
Windows Communication Foundation 體系結構
作者:晴天豬
出處:http://www.cnblogs.com/IPrograming
本文版權歸作者和博客園共有,轉載請注明出處。
