認識Windows Communication Foundation

            很久沒有寫博客,做爲一個程序員,我竟然習慣了不寫博客。也難怪這些年來,一直原地踏步,無所長進。真是一份付出一份收穫,種瓜得瓜,種豆得豆。html

Windows Communication Foundation   是一種很是實用、很是強大的技術。屬於.NET範疇內的,微軟推出的技術。在這個.NET即將失去市場的日子裏,也只有WCF這個技術還有點價值,還能夠獲得市場的承認。爲了提高本身的價值,要好好學習一些實用、值錢的技術。java

                                                          

Where Is WCF Come From

            wcf是什麼?爲何是一項值錢的技術?在開始說明wcf是什麼、wcf的價值以前,讓咱們先回顧一下早些日子裏的我的電腦應用程序是如何工做的,這樣有助於理解,爲何會推出wcf這項技術。在最初的日子裏,我的電腦應用軟件都很是匱乏且不能夠多個任務同時進行。例如: word processor(文字處理器) 、spreadsheet(電子表格)、database(數據庫)。通常用戶,使用數據庫存儲業務數據,用電子表格分析數據,最後經過文字處理器將這些數據整理作出報表。這些個應用程序之間不能相互通訊、交互操做,而且必選安裝在相同的一臺電腦上。隨着網絡的不斷髮展,人們對數據共享的要求愈來愈急迫。例如,在一個公司內的員工,須要共享數據,那麼就須要各個應用軟件間互相通訊、互相交互,且這些應用軟件能夠安裝在不一樣的電腦上。程序員

        此時,就出現了Inter-Process communication技術(進程間通訊)。例如 named pipe、sockets,這些技術的出現,使得應用程序之間能夠相互交互、通訊、互相發送信息、協同完成任務。可是,這些技術都是很是底層的網絡技術,對開發人員要求極高,大大增強了開發人員的工做量。隨着技術的快速發展,微軟又相繼推出了Component Object Model(COM)、Distributed Component Object Model(DCOM)、COM+、.NET Framework、Remoting 等技術。這些技術,都是爲了實現應用程序與組件之間相互通訊的。web

     既然有這麼多技術來支持應用程序與組件之間通訊,那爲何還須要推出WCF這項技術呢?它又爲何比其餘技術更值錢呢?若是咱們平常需求只停留在局域網內,各個軟件之間共享數據、發送、接收數據,協同完成任務這個層面,那麼以上那些技術已經能夠很好的知足咱們的需求了,根本不須要使用WCF這項技術。可是,隨着World wide web的快速發展,出現了web Service這個概念。web service,是指在服務器上執行的應用程序或組件。也就是說,咱們使用的應用程序或者服務,不是本地安裝軟件,而是經過World wide web來訪問部署這些應用軟件的服務器,來獲取服務。咱們在平日的項目開發中,特別是前臺開發,咱們都會常用Ajax技術來實現頁面局部刷新,或者經過Ajax調用後臺代碼,完成對數據庫的增刪改查。其實,Ajax就算一種web service常用的技術 .web service概念與另外一個概念聯繫緊密,Service-Oriented Architecture(SOA 面向服務架構). 功能以接口的形式提供給用戶,接口的實現,對用戶透明,用戶不會看到接口的實現,也不須要關注接口的實現。接口的實現,可使用已有的軟件功能或者其餘的web service。面向服務的體系結構,就是分佈式服務。數據庫

   經過以上對web service 與SOA的理解,你們能夠看出,其實分佈式服務的實質,就是經過網絡與各個應用服務、組件相互接收信息、回覆信息、協同合做。這些應用服務、組件能夠部署在世界上的任何地方,不在像以前那麼,侷限在一個公司的局域網中。WCF就是爲了建立web service而推出的技術。web service是一種服務,它不依賴於開發語言與部署服務器環境。使用java等其餘語言,也能夠實現一個web service。瀏覽器

 

The  Benefits Of WCF

           要想實現應用程序與web service的通訊,就要考慮如下幾點:安全

     1.傳輸數據的格式服務器

     2.傳輸使用的協議網絡

     3.數據安全架構

     以上這些問題,都是須要雙方認同的、須要保持一致的。只有這樣,才能夠互相通訊。web service使用XML 或者JASON做爲數據傳輸的格式。使用Simple Object Access Protocol(SOAP)協議進行相互通訊。SOAP協議定義了:

    1.SOAP協議消息的格式

   2.傳輸數據如何加密

   3.怎樣對SOAP消息回覆

web service能夠發佈Web Service Description Language(WSDL)文檔,這個文檔是由XML形式展現的,描述了Web Service能夠接收的消息、以及返回的消息結構。客戶端應用程序經過WSDL文檔來決定如何與Web Service進行通訊。

以上的這些,WCF會提供一個模型,很方便配置以上內容。

Building WCF Service

  接下來,咱們來動手開發一個WCF服務。要開發的WCF包含兩部分:WCF服務、客戶端應用程序。將開發好的WCF服務部署到IIS上,客戶端應用程序調用服務。

WFC能夠基於多種類型的模板開發,例如網站、類庫、工做流等。今天咱們使用網站模板來開發WCF服務。

1、  先建立一個空的解決方案,名稱爲TestService.

2、 雙擊解決方案->新增->新網站。 彈出的窗口,選擇WCFService.以下圖:

WeChat Image_20180626220732_副本

3、建立WCF Service 後,以下圖:

WeChat Image_20180626221918

我將網站起名字爲PracticeService, 圖中被紅色圈中的是WCF 服務,TestService是客戶應用程序,待會下面會講到。

在App_Code文件下,會出現兩個類:IService.cs 、Service.cs。我將對應的兩個類改成了:IPracticeService.cs  Practice.cs。

 

Definition Contract

 
 
 
 WCF包含,Service Contract(服務契約)、Data Contract(數據契約)、Operation Contract(操做契約)、Member Contract(數據成員契約)。
Service Contract:向外界提供的服務。只有標註爲Service Contract 的接口,才能被外界以服務的形式看到。
Operation Contract:接口內的方法,只用被Operation Contract屬性定義後,才能夠被外界調用。
Data Contract:只有被Data Contract 屬性定義後的類,纔可被WCF序列化、反序列成符合XML Schema(XML架構)的數據流。從客戶端至WCF服務,數據類型必定要符合XML Schema.客戶端發送數據至WCF,先將數據類型系列化成XML流,到達WCF服務端後,WCF將XML數據流,反序列化成.NET對象,反之亦然。因而可知,只要是須要傳輸的類,必需要具備Data Contract.(Data Contract 屬性能夠定義在類、結構、枚舉上)。
Data Member:被傳輸的類中字段,須要被Data Member屬性標記,才能夠被訪問。
如下是IPracticeService.cs代碼段:
using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; namespace Test { [ServiceContract] public interface IPracticeService { [OperationContract] List<string> GetAllGirl(); [OperationContract] Girl GetSpecificGirl(string Id);  // TODO: Add your service operations here  } // Use a data contract as illustrated in the sample below to add composite types to service operations.  [DataContract] public class Girl { [DataMember] public string Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Age { get; set; } [DataMember] public string Marry { get; set; } } }
這是一個被Service Contract屬性標記的接口,也是WCF服務提供的服務。接口內的方法,被Operation Contract屬性標記過,才能夠被訪問。定義了一個Girl類,使用Data Contract標記,其中字段使用DataMember屬性標記。這個接口提供了一下幾個功能:
1.獲取全部女孩子信息
2.獲取具體某個女孩子信息
 
令Practice.cs類實現IPractice接口,下面是Practice實現類代碼段:
using System.Collections.Generic; // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service" in code, svc and config file together. namespace Test { public class Practice : IPracticeService { public List<string> GetAllGirl() { List<string> collect = new List<string>(); string name = "MARY"; collect.Add(name); name = "CHRISTINE"; collect.Add(name); name = "TINA"; collect.Add(name); name = "CRYSTAL"; collect.Add(name); name = "SUZANNE"; collect.Add(name); name = "BEATRICE"; collect.Add(name); name = "KATIE"; collect.Add(name); return collect; } public Girl GetSpecificGirl(string Id) { Girl girl = new Girl { Age = "22", Name ="SUZANNE", Marry = "Single"}; return girl; } } }
 

咱們只是爲了,實現WCF服務與客戶端通訊,因此簡單起見,再也不寫複雜的數據訪問層代碼,不訪問數據庫,直接hard-code代碼,來實現接口。

值得注意的是,.svc文件(Service.svc)。這個文件指明瞭,實現了WCF服務類的名稱與位置。特別是在將WCF服務部署到IIS時,IIS須要.svc文件。以下圖:

image

image

 

右擊Service.svc,選擇在瀏覽器中查看。看到以下圖信息時,說明成功建立了WCF服務。

image

點擊上圖中兩個連接的任意一個,彈出以下圖頁面:

image

這個頁面,顯示的是WSDL(Web Service Definition Language)文檔,是由WCF 服務生成的元數據文件,描述了WCF服務的相關信息。客戶端,就是經過WSDL文檔,去與WCF服務通信。能夠把WSDL文檔,看做是商品使用說明書。(WCF 服務,看做是商品)

以上就是咱們的PracticeService 服務,它提供了兩個方法,1.獲取全部女孩子信息 2.獲取具體某個女孩子信息。服務開發完了,可是還不能被訪問。由於須要部署到Internet ,才能夠被全世界訪問到。接下來,就要部署WCF服務。

 

Deploying WCF Service Into IIS

WCF能夠被部署到多種環境中,例如:IIS、 Windows服務、獨立的應用程序等。在這裏,以IIS爲例。

雙擊PracticeService網站,點擊發布web應用程序,以下圖:

WeChat Image_20180627214851

選擇自定義,在彈出頁面,輸入PracticeService做爲文件名。

image

按照下圖序號依次操做。

image

部署後,打開IIS,應能看到以下圖所示,WCF 服務部署成功。

image

接下來,就是測試WCF服務了。

 

Building A WCF Client Application

建立一個控制檯程序,TestService.雙擊服務引用,選擇添加服務引用。以下圖:

image

點擊發現,會看到咱們剛纔部署的WCF服務。在下面的命名空間,填寫PracticeService.

image

測試WCF服務,調用WFC服務。

using System; using TestService.PracticeService; namespace TestService { class Program { static void Main(string[] args) { Console.WriteLine("Press ENTER when the service has started"); Console.ReadLine(); PracticeServiceClient proxy = new PracticeServiceClient(); Console.WriteLine("Test 1: List all Gril's name"); string[] grils=proxy.GetAllGirl(); foreach (string girlsName in grils) { Console.WriteLine("Number: {0}", girlsName); } Console.WriteLine(); Console.WriteLine("Test 2: Display the details of a girl"); Girl girl = proxy.GetSpecificGirl("CHRISTINE"); Console.WriteLine("Number: {0}", girl.Name); Console.WriteLine("Age: {0}", girl.Age); Console.WriteLine("marry: {0}", girl.Marry); Console.WriteLine(); } } }

引用服務引用命名空間,using TestService.PracticeService; 該命名空間包含PracticeServiceClient類(proxy),代理類。代理類至關於客戶端到WCF Service之間的翻譯官。代理類使客戶端對WCF服務的訪問,變成相似於對象實例訪問方法的形式。代理類將客戶端對函數的調用轉換成對WCF 服務的訪問。wcf服務返回的消息,被代理類轉換成對函數的調用。

代理類是如何作到這些的呢?當 WCF服務發佈後,會生成WSDL文檔,WSDL文檔描述了WCF服務的metadata(元數據)。代理類就是經過WSDL來完成翻譯工做的!

請注意APP.config文件,以下圖:

image

上圖中Client標籤內的信息,說明了客戶端是如何與WCF Service通訊的。在Client的標籤內的endpoint(終結點)標籤,說明了WCF service的詳細信息。其中包括:

address(地址):web service服務部署的地址,以便客戶端去訪問。

binding(綁定):主要包含web service通訊相關的信息,例如傳輸機制、傳輸協議等。binding支持多種傳輸協議,默認使用BasicHttpBinding,使用http協議通訊。

contract(契約):說明web service提供的服務。

 

WCF AND The Principles of  SOA

到此,咱們已經使用WCF開發了一個webservice服務,只要知道部署webservice服務的地址,世界上任何一臺計算機,均可以使用它。咱們前面講到了,SOA(Service-Oriented  Architecture 面向服務的架構)。SOA的原理,就是將軟件功能以服務的形式放在internet上,客戶不須要知道實現服務的細節,只要明白這個服務是作什麼的,知道服務所在地址,就能夠。就像咱們知道一張圖片的地址,咱們就能夠去訪問它。每一個服務都是一個小web service,客戶端使用服務,訪問web service.由於與web service的訪問與網絡協議,傳輸協議等有關,與客戶端程序用何種語言開發無關。因此,web service能夠被不一樣語言開發的客戶端程序通訊。

WCF是一個實現SOA程序的平臺,使用WCF能夠快速開發SOA程序。

相關文章
相關標籤/搜索