最近在學習MSDN廣播站徐長龍老師的“跟我一起從零開始學WCF系列課程”,整理成學習筆記以供備忘和分享,新手入門請大家輕拍哦!
本章主要內容如下:
1.1 必備基礎知識
1.2 什么是WCF?
1.2.1 場景介紹
1.2.2 常規.NET技術
1.2.3 What is WCF
1.2.4 WCF是對現有技術的統一
1.2.5 WCF的設計目標
1.2.6 DEMO:創建一個WCF服務
1.3 WCF背景介紹
1.3.1 ASP.NET
1.3.2 WSE
1.3.3 WCF
1.3.4 為什么會有WSE?
1.4 小結
1.1 必備基礎知識:
• 熟悉Web Service編程
• 熟悉Visual Studio 2005/2008
• 熟悉分布式應用程序開發
1.2 什么是WCF
1.2.1 場景介紹
在了解什么是WCF前,我們先看一個場景,通過對此場景的分析,用常規.NET技術是實現需要用到哪些知識,然后引出WCF技術。
場景如下:
一家汽車租賃公司決定創建一個新的應用程序,用於汽車預定;
該租車預定應用程序的創建者知道,應用程序所實現的業務邏輯必須能夠讓公司內外運行的其他軟件訪問,主要要求包括:
a 運行在Windows 桌面上的呼叫中心客戶端應用程序;
b 基於J2EE 服務器構建、在非Windows 系統上運行的現有預定應用程序。由於最近與另一家汽車租賃公司合並,此現有系統必須能夠訪問新應用程序的邏輯,以便為合並后公司的客戶提供一致的體驗;
c 運行在各種平台上的合作伙伴應用程序,每個應用程序分別位於一個與該汽車租賃公司有業務合作的公司內。合作伙伴可能包括旅行社、航空公司,以及具有租車預定業務需求的其他組織。
假定該汽車預定程序是基於.NET FRAMEWORK的,a的呼叫中心在局域網內,也是.NET平台的,主要是對性能要求高一些;b的子公司應用程序是基於J2EE框架的,這樣對互操作性、安全性和事務性要求高;c的合作伙伴應用程序是在互聯網上,可能基於各種平台的,同樣對操作性、安全性和事務性要求很高。圖1.1可以清晰地反映出這種局域網跨平台、跨互網絡多平台的情況。
圖1.1
1.2.2 常規.NET技術
基於上述場景,如果沒有WCF,應用程序可能要使用多種現有的.NETFramework 技術,圖1.2可以一目了然地看出來。
a 對於局域網內的呼叫中心,性能要求高, .NET遠程處理 remoting技術 在性能和壓縮方面都比較好
– .NET Framework 遠程處理。
– 這種技術可用於與呼叫中心應用程序進行通信,因為二者都是建立在.NET Framework 之上的。遠程處理專門為緊密耦合的.NET 到 .NET 通信而設計,因此它為本地網絡中的應用程序提供了無縫而直接的開發體驗。
– 缺點:維護、調試困難
b 對於局域網內跨平台的子公司應用程序和跨互聯網多平台的合作伙伴應用程序,互操作性、安全性、事務性要求高,分別采用以下技術:
1)實現互操作性--ASP.NET Web Service(ASMX)
– ASP.NET Web 服務(ASMX)。
– 這種技術用於與基於J2EE 的現有預定應用程序,以及與Internet上的合作伙伴應用程序進行通信。 因為目前大多數平台都支持基本的Web 服務,所以在WCF 發布之前,這是實現跨供應商互操作性的最直接的方法。
2)實現安全性采用WSE(Web Services Enhancements)--加強web service安全性的技術
– 可與ASMX 一起使用,以便與基於J2EE 的預定應用程序以及合作伙伴應用程序進行通信。它實現了最新定義的一些Web 服務協議(統稱WS-* 規范),因此只要相關所有應用程序都支持這些新規范的兼容版本,WSE 就可提供更加靈活的 Web 服務安全性。
3)事務性:企業服務(Enterprise Service)解決企業級網絡間的事務處理,Microsoft消息隊列(MSMQ)異步消息發送和接收的技術
– 企業服務。
– 租車預定應用程序使用該技術來管理對象生存期和定義分布式事務。在與此應用場景中的任何其他應用程序通信和集成時,這些功能會很有用,但是企業服務僅支持有限的一組通信選項。
– Microsoft 消息隊列(MSMQ)。
– 用於與基於Windows 的合作伙伴應用程序進行通信,這些應用程序對數據傳送、工作量分離以及應用程序生存期均要求有保證。消息隊列提供持久穩定的消息傳送,這通常是間歇式連接的應用程序的最佳解決方案。
4)缺點:維護、調試困難
圖1.2
由於建立在.NET Framework 之上,該汽車預定應用程序必須使用這些通信技術中的多種技術才能滿足其要求。盡管這在技術上是可行的,但最終的應用程序實現起來將會很復雜,而且維護起來也很困難。
1.2.3 What is WCF?
WCF 就是針對這種繁雜卻又切實存在的情況而設計的,是公開和訪問服務的Windows應用程序的首選技術,基於分布式計算,面向服務的開發技術 windows communication foundation,一種全能型,高級版的web service,不僅是實現web servci企業服務,消息隊列的安全性技術方案,這些技術都是企業級的應用。WCF 可使用Web 服務進行通信,因此與同樣支持SOAP 的其他平台(例如基於J2EE 的主流應用程序服務器)間的互操作性就變得簡單明了。
圖1.3
使用WCF,該解決方案的實現就容易得多了。如圖1.3中所示,WCF可用於前述所有情況。因此,租車預定應用程序使用這一種技術就可以實現其所有應用程序間的通信。• WCF 可使用Web 服務進行通信,因此與同樣支持SOAP 的其他平台(例如基於J2EE 的主流應用程序服務器)間的互操作性就變得簡單明了。
• 還可以對WCF 進行配置和擴展,以便與使用並非基於SOAP 的消息(例如像RSS 這種簡單的XML 格式)的Web 服務進行通信。
• 性能是大多數業務中至關重要的考慮事項。開發WCF 的目標就是要使之成為Microsoft 所開發的速度最快的分布式應用程序平台之一。• 當通信雙方都建立在WCF 上時,為獲得最理想的性能,本例中使用的線上編碼是XML 信息集的一個優化的二進制版本。消息仍遵循SOAP 消息的數據結構,但其編碼使用該數據結構的二進制表示形式,而不是XML 1.0 文本編碼的標准尖括號加文本格式。使用此選項的意義體現在與呼叫中心客戶端應用程序的通信中,因為該應用程序也是建立在WCF 上,並且性能是一個重要的考慮事項。
• 管理對象生存期、定義分布式事務以及企業服務的其他方面的功能現在可以由WCF 來提供。任何基於WCF 的應用程序都可以使用這些功能,這意味着租車預定應用程序可以針對與之通信的任何其他應用程序使用這些功能。
• WCF 支持一個大的WS-* 規范集,因此可在與同樣支持這些規范的任何其他平台進行通信時幫助提供可靠性、安全性和事務。
• 建立在消息隊列上的WCF 排隊消息選項使應用程序能夠使用持久的排隊,而無需使用另外一組應用程序編程接口。• 提供統一的,可用於建立安全、可靠的面向服務的應用的高效開發平台。
• 將Web 服務的概念直接映射到.NET Framework 公共語言運行庫(CLR) 中的對應內容,包括將消息靈活且可擴展地映射到用諸如Visual C# 或Visual Basic 等語言實現的服務。該服務模型提供支持松散耦合和版本管理的序列化功能,並提供與諸如消息隊列(MSMQ)、COM+、ASP.NET Web 服務、Web 服務增強(WSE) 等現有 .NETFramework 分布式系統技術以及很多其他功能的集成和互操作性。
1.2.4 WCF是對現有技術的統一
由圖1.4可以看出,WCF統一System Messaging, WSE, .NET Remoting, ASMX 與Enterprise Services的開發模型,為各種應用提供單一的編程模型,基於配置驅動的協議選擇,消息格式,進程分配等。
圖1.4
1.2.5 WCF設計目標
a 生產效率
--統一了現有的各種分布式技術(System Messaging, WSE, Remoting, ASMX, Enterprise Service)
--基於屬性(Attribute)的開發(類和方法用屬性去修飾,實現定義)
--與Visual Studio.NET 2005的無縫集成,.NET 2008/2010 更無縫集成了
b 可交互性
--廣泛地支持WS-*系列通用規范
--與現有的微軟分布式技術相兼容,用.NET框架包裝了一次現有的分布式技術
c 面向服務的開發
--使得編寫松散耦合的服務變得容易,跨應用程序,跨網絡(面向對象的開發是緊密耦合)
--服務的行為及屬性(如通訊方式)可以通過配置來指定,配置文件web conig或application config,部署非常靈活
圖1.5
1.2.6 創建一個WCF服務
-全新的Web Service 界面,不再是.asmx文件,不是asp.net網站上web服務了
-屬性化編程

//接口類文件 //增加屬性類[]修飾,服務的協定/合同,定義好WCF服務的名字 [ServiceContract] Public interface IHelloService { //定義服務方法的名字 [OperationContract] string Hello(); } //實現接口類文件 public class HelloService : IHelloService { public string Hello () { return “Hello”; } }
這個方法不僅可以給內部網同樣WCF的客戶端程序調用,還可以配置為在IIS里集成的一個公開的web服務方法,給J2EE的應用程序或者internet上的任何合作伙伴應用程序調用。
demo:
開發環境:Visual Studio 2008 + NET Framework 3.5。
開發步驟:
a. 打開VS2008->New->Project->Visual C#->WCF->WCF Service Library, 創建WcfServiceLibrary1;
b. 打開接口文件IService1.cs:自動引用using System.ServiceModel;WCF服務封裝在這里面(App.config很重要 里面配置一些服務地址host、endpoint、行為behavior等,有關配置、綁定之類的后續章節會講到);

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfServiceLibrary1 { // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in App.config. //ServiceContract為服務契約 [ServiceContract] public interface IService1 { //OperationContract為方法契約 [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: Add your service operations here } // Use a data contract as illustrated in the sample below to add composite types to service operations //DataContract修飾自定義類,便於soap序列化 [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; //修飾自定義類的屬性 [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } } }
c.打開實現接口類文件Service.cs

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfServiceLibrary1 { // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config. public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } } }
d. 調試:F5 -> WCF Test Clint (WCF Service Host) -> http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex ->IService1 (WSHttpBinding_IService1) ->雙擊GetDataUsingDataContract() -> GetDataUsingDataContract中選擇True –> StringValue 輸入”test by dqj”-> 點擊“Invoke” -> Respose中BoolValue顯示True,StringValue 顯示"test by dqjSuffix"。
由此可見,該服務主要實現一個GetData方法,用於提示用戶輸入的數字(如"You entered: 5"),實現另一個方法GetDataUsingDataContract,該方法根據自定義類型CompositeType的BoolValue屬性,如果為True則在用戶輸入的字符串后面添加Suffix(如"test by dqjSuffix")
圖1.6
e. 剛才是直接調試WCF服務程序,我們也可以創建客戶端程序來調用WCF服務。如在項目中添加客戶端程序WindowsFormsApplication1,添加按鈕(btnInvokeWCFService),按鈕事件中添加如下代碼:

private void btnInvokeWCFService_Click(object sender, EventArgs e) { ServiceReference1.Service1Client data = new WindowsFormsApplication1.ServiceReference1.Service1Client(); //MessageBox.Show(data.GetData(5)); ServiceReference1.CompositeType myType = new WindowsFormsApplication1.ServiceReference1.CompositeType(); myType.BoolValue = true; myType.StringValue = "hello"; //ServiceReference1.Service1Client myClient = new WindowsFormsApplication1.ServiceReference1.Service1Client(); //MessageBox.Show(myClient.GetDataUsingDataContract(myType).StringValue); ServiceReference1.CompositeType returnType = new WindowsFormsApplication1.ServiceReference1.CompositeType(); returnType = data.GetDataUsingDataContract(myType); MessageBox.Show(returnType.StringValue); }
f. 設置WindowsFormsApplication1為啟動項,F5 -> 點擊按鈕“Invoke WCF Service” -> 彈出"You entered: 5" -> 點擊確定 -> 彈出"helloSuffix"
圖1.7
1.3 WCF背景介紹
階梯式發展:ASP.NET -> WSE -> WCF 安全性越高,功能越強大
圖1.8
1.3.1 ASP.NET網絡服務(結構由下往上,[]內代表不能實現的內容):
- 傳輸層:HTTP [TCP Custom(自定義傳輸協議) …]
- 網絡基礎:
[Security Reliability Transactions]
Metadata
Messaging
XML
- 應用軟件層: Connected Applications (Management Business Process …)
圖1.9
1.3.2 WSE(結構由下往上,[]內代表不能實現的內容,()代表包含關系):
- 傳輸層:HTTP TCP Custom …
- 網絡基礎:
Security [Reliability Transactions]
Metadata
Messaging
XML
- 應用軟件層:Connected Applications (Management Business Process …)
圖1.10
1.3.3 WCF(結構由下往上,[]內代表不能實現的內容):
- 傳輸層:HTTP TCP Custom …
- 網絡基礎:
Security Reliability Transactions
Metadata
Messaging
XML
- 應用軟件層: Connected Applications (Management Business Process …)
圖1.11
1.3.4 為什么會有WSE?
– 基本的ASPNET 無法滿足工業界對網絡安全越來越多的需求
– WCF 又需要有較長的時間來完成,到06年底才正式發行
– WS-* 通信協議也需要有一個微軟產品來支持
– WSE 就這樣誕生了
WSE1.0 2003年2月
WSE2.0 2004年7月
WSE3.0 2005年11月
WCF 2006年底
1.4 小結
• 什么是WCF?
• WCF背景介紹
點擊下載DEMO:WcfServiceLibrary1
作者:不具名的空間
出處:http: // www.cnblogs.com/dqj1024/
版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。