WCF學習筆記(1)——Hello WCF


1.什么是WCF

  Windows Communication Foundation(WCF)是一個面向服務(SOA)的通訊框架,作為.NET Framework 3.0的重要組成部分於2006年正式發布。WCF的使命是對Windows平台下現有的通訊技術(包括:COMDCOM.NET RemotingWeb ServicesMSMQWinSocket)進行全面整合,並設計了一個統一的程序開發模型(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 體系結構

元數據

終結點

ServiceModel 元數據實用工具

《WCF全面解析》

作者:晴天豬

出處:http://www.cnblogs.com/IPrograming 

本文版權歸作者和博客園共有,轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM