2001年8月,我在微軟首次了解到使用托管代碼重寫COM+的技術細節。隨後一切如常,直到2002年7月,在對C#2.0作戰略性設計評審期間,負責 Remoting的程序經理提出了一個宏偉的計劃,試圖將Remoting重寫為開發者真正能夠使用的技術。同時,微軟也在尋求合作,共同為ASMX中的 web服務制訂全新的安全規范,起草一系列附加的web 服務規格說明書。
到了2003年7月,我有機會體驗了一個全新的事務型體系架構,它能夠改善.Net編程中關於事務處理的相關缺陷。當時,並沒有一個穩定的編程模型能夠統一那些獨立的技術。直到2003年末,我有幸獲邀參加一個由同行專家組成的小型團隊,對代號為Indigo的開發平台進行戰略性的設計評審。就我所知,這個開發團隊可謂人才濟濟,匯聚了許多世界上最優秀的天才。在接下來的2-3年時間內,Indigo一共經歷了三代編程模型版本的演變。就在2005年早期發布了基於終結點驅動對象模型的版本之後,終於於是年8月逐漸穩定為一個固定的版本,同時更名為Windows Communication Foundation(WCF)。
要想得到開發者的眾口稱贊,可謂難於上青天,然而WCF卻給了我們不同的诠釋。對於Web服務的開發者而言,WCF就是最終的應對互操作性的解決方案,實現了大多數行業標准。分布式應用程序的開發者則認為它簡化了遠程調用以及隊列調用。系統開發者認為它具備下一代面向產品的特征,諸如事務與宿主,為應用程序提供了現成的基礎功能模塊。至於應用程序的開發者,WCF則為他們構建應用程序提供了聲明式的編程模型。而對於架構師,WCF則是構建面向服務應用程序的最終選擇。一言以敝之,WCF涵蓋了以上所有的一切,因為設計WCF的目的就是為了能夠統一微軟的下一代全新的技術。
對我而言,WCF就是下一代開發者平台,它在很大程度上包容了最初的.NET編程理念。任何.Net開發者都可以使用WCF,而不用考慮應用程序的類型、規模或者行業領域。WCF是一門基礎技術,它提供了生成服務與應用程序的"終南捷徑",完全符合我所認同的良好的設計准則。WCF從一開始就是工程化的,能夠簡化應用程序的開發與部署,降低開發成本。WCF服務用於構建面向服務的應用程序,不管這些程序是獨立的桌面應用程序,還是Web應用程序;是服務,還是高端的企業應用程序。
關於本書的結構
本書涵蓋了所有設計開發基於WCF的面向服務應用程序所需的知識與技能。通過本書,你可以看到如何利用WCF內建的特性,例如服務托管、實例管理、並發管理、事務、離線隊列調用以及安全。本書會為你展示如何使用這些特性,並探究它們在這種特定的設計思路下的實現原理。你不僅能夠了解到WCF編程技術,以及相關的系統知識,同時還包括了相應的設計方案、訣竅、最佳實踐以及存在的缺陷。我之所以站在軟件工程的立場闡述本書的每個主題與特征,是因為我期望它能夠幫助讀者不僅要成為一名WCF專家,而且還要成為一名優秀的軟件工程師。本書帶給您的這種認知能夠使你如虎添翼,讓你的應用程序在可維護性、可擴展性、可重用性以及高效性方面,更加符合軟件工程的理念。
本書回避了許多WCF的實現細節,更多的是注重使用WCF的實用性與可行性:如何應用WCF技術?如何選擇可行的設計原則與編程模型?本書大量使用了.Net 2.0技術,從某種角度來說,本書也可以算是一本高級的C#技術書籍。
除此之外,本書包含了大量我所編寫的套件類、工具類以及輔助類。這些類或者可以提高你的開發效率,保障開發的WCF服務的質量。我還開發了一個基於WCF技術的小型框架,用以彌補一些設計缺陷,或者簡化確切的任務,使其能夠自動化實現。在書中,我像介紹WCF技術那樣,詳細地介紹了這些工具、理念與技術。同時,我開發的框架則為你演示了如何對WCF進行擴展。
在過去的兩年中,我在MSDN雜志上發表了大量關於WCF的文章。目前,我還在為雜志的基礎專欄(Foundations Column)撰寫WCF技術文章。我要感謝雜志社能夠允許我將這些文章收錄到本書中。如果你曾經閱讀過這些文章,或許能夠從本書的相關章節中發現它們的影子。比較而言,本書的章節更加全面,提供了WCF的多種視角、技術與實例,而且這些主題也與書中的其它章節緊密相連。
我在每一章中都系統地講解了一個專題,深入探討了這些專題的內容。然而,每一章又都依賴於前一章的內容,因此,我建議你最好按照先後順序閱讀本書。
以下是書中各章節以及附錄的摘要:
第1章,WCF基礎
本章首先闡釋了WCF的技術原理,並描述了WCF的基礎概念和構建模塊,例如地址(Addresses)、契約(Contracts)、綁定(Bindings)、終結點(Endpoints)、托管(Hosting)以及客戶端(ClIEnts)。在本章最後還討論了WCF體系架構,它將是幫助我們理解後面章節的關鍵。本章假定讀者已經了解面向服務的思想與優勢。如果你不具備這方面的知識,可以首先閱讀附錄A的內容。即使你已經熟悉了WCF 的基礎概念,我仍然建議你至少能夠快速地浏覽本章的內容,它不僅能夠鞏固你已有的知識,更在於本章介紹的一些輔助類與技術術語有助於你閱讀全書。
第2章,服務契約
本章致力於介紹服務契約的設計與開發。首先,你會了解到一些有用的技術,包括服務契約的重載與繼承以及其它高級技術。然後,本章深入探討了如何設計以及分解契約,以利於服務的重用、可維護性以及可擴展性。最後,本章還將向你展示了如何通過公開契約元數據完成運行時的交互編程。
第3章,數據契約
如果沒有實際存在的可共享的數據類型本身,如果沒有使用相同的開發技術,我們應該如何處理客戶端與服務之間的數據交換?在本章,你可以看到如何處理某些有趣的現實問題,例如數據版本控制,以及傳遞元素項集合的方式。
第4章,實例管理
究竟是哪一種服務實例處理哪一種客戶端的請求?本章給出了問題之鑰。WCF支持多種服務實例管理、激活以及生命周期管理技術,這些技術與系統規模和性能息息相關。本章給出了每一種實例管理模式之間的關系,指導讀者何時以及如何有效地使用它們。本章還介紹與之相關的主題,例如限流(Throttling)。
第5章,操作
隨著對各種類型操作的處理,客戶端能夠調用服務,遵循相關的設計原則,例如如何改善和擴展基礎功能,以支持回調的安裝與銷毀,管理回調端口與通道,提供類型安全的雙向代理(Duplex ProxIEs)。
第6章,錯誤
本章全面介紹了服務將錯誤與異常返回給客戶端的方式,畢竟,諸如異常與異常處理的構建都是一門特定的技術,無法穿越服務邊界。本章介紹了錯誤處理的最佳實踐,使開發者能夠解除客戶端錯誤處理與服務的耦合度。本章還演示了如何擴展以及改善WCF基礎的錯誤處理機制。
第7章,事務
首先,本章從整體上介紹了使用事務的目的,然後討論了事務服務的眾多特征:事務管理架構、事務傳播(Transaction Propagation)配置、WCF提供的聲明性事務支持,以及客戶端創建事務的方式。最後,本章討論了與事務相關的設計原則,例如事務服務狀態管理與實例模式。
第8章,並發管理
WCF提供了一種強大然而簡單的聲明方式,用來管理客戶端與服務的並發與同步。本章展現了諸多高級技術,例如回調、重入(Reentrancy)、線程關聯度(Thread Affinity)、同步上下文(Synchronization Context)以及避免死鎖的最佳實踐與原則。
第9章,隊列服務
本章描述了客戶端如何通過隊列調用服務,從而支持異步與離線工作。本章首先介紹了如何創建與配置隊列服務,然後,重點講解了諸如事務、實例管理、故障以及它們對服務業務模型與實現造成的影響。
第10章,安全
通過將多個方面的任務分解為一些基本的要素,如消息傳遞、認證和授權,就可以揭開面向服務安全神秘的面紗。本章演示了如何為局域網和互聯網應用程序等關鍵場景提供安全保障。最後,你可以看到我為聲明式的WCF安全所編寫的框架,設計為自動實現安全的設置,從而極大地簡化對安全的管理。
附錄A,面向服務概述
附錄A為那些希望了解面向服務的讀者提供,介紹了我在面向服務的具體應用。附錄定義了面向服務應用程序(而非通常所謂的架構)以及服務自身,檢驗了它在方法學方面的優勢。附錄還給出了面向服務的原則,通過大多數應用程序所需要的實用要點,強化了面向服務的抽象原則。
附錄B,服務發布與訂閱
附錄B展現了我定義的框架,它實現了發布-訂閱事件管理的解決方案。框架可以使你只需要編寫一兩行代碼就能發布和訂閱服務。發布-訂閱模式屬於第5章的內容,之所以將它放入到附錄中,是因為它使用了其它章節的內容,例如事務與隊列調用。
附錄C,WCF編碼規范
基本上,附錄C涵蓋了全書提及的甚至於沒有提及的最佳實踐。規范在於闡釋應該"如何做"以及"怎麼做",而不闡明其原因。隱藏在規范之中的基礎原理可以在本書的其余部分找到。本規范同時還使用了本書討論的輔助類。
對於讀者的假定
本書假定讀者是一名經驗豐富的開發者,熟悉諸如封裝與繼承等面向對象的概念。我會利用讀者現有的對對象和組件技術以及術語的認知,鞏固對WCF知識的了解。讀者應該對於.Net以及C# 2.0的基礎知識(包括泛型與匿名方法)有著清晰的了解。雖然本書大部分內容使用的是C#語言,然而對於Visual Basic 2005的開發者而言,仍然具有參考價值。
怎樣使用本書
若要使用本書,需要安裝.NET 2.0、Visual Studio 2005、.NET 3.0的發布組件,以及.NET 3.0開發的SDK和Visual Studio 2005的.Net 3.0擴展版。除非特別提示,本書適用的操作系統包括Windows XP、Windows Server 2003和Windows Vista。同時,你還需要安裝一些附加的Windows組件,如MSMQ和IIS。
它是一個虛擬圖書館,讀者通過它可以便捷地搜索到數千本頂尖的技術書籍,剪切和粘貼代碼實例,下載書中的章節,搜尋你所需要的更詳盡、更准確的信息。趕快行動吧,體驗就在http://safari.oreilly.com。
致謝
如果沒有WCF(Indigo)項目經理們一直以來的支持與協助,我根本不可能在WCF誕生之初就能夠熟練掌握這門技術。我必須感謝我的朋友Steve Swartz,作為WCF的一名架構師,他不僅僅奉獻了他的學問與識見,還有他的熱情,始終不厭其煩地在IM(即時通訊工具)之上與我探討相關問題。感謝 Yasser Shohoud,Doug Purdy以及Shy Cohen,感謝他們就本書作出的精彩而又重要的設計復審,同時還要感謝Krish Srinivasan,感謝他在軟件工程學上如哲學家一般的真知灼見。能夠與你們一起合作,是我三生有幸,也是我在學習掌握WCF過程中的重要收獲。以下 WCF程序員則犧牲了他們的時間,幫助我闡明了WCF這門技術:Andy Milligan, Brian McNamara, Eugene Osovetsky, Kenny Wolf, Kirill Gavrylyuk, Max Feingold, Michael Marucheck, Mike Vernal, and Steve Millet。同時還要感謝這個小組的經理Angela Mills。
除了微軟的成員,我還要感謝Norman Headlam和Pedro Felix,你們給了我非常有價值的反饋。感謝Nicholas Paldino的幫助。Nick對於.Net框架的理解是獨一無二的,正是因為他見微知著的細致精神,才能夠保證本書的品質。
最後,我要感謝我的家人。我的妻子Dana,是你始終如一地鼓勵我,讓我能夠寫下我的所思與所得,但卻犧牲了陪伴你和女兒們的寶貴時間。感謝我的父母,是你們帶給了我對工程學的無盡熱愛。我還要將本書獻給我的兩個女兒,7歲的Abigail,4歲的Eleanor。對於我而言,可愛的你們就是我的整個世界。