WCF 入门 WCF基础知识问与答
學習WCF已有近兩年的時間,其間又翻譯了Juval的大作《Programming WCF Services》,我仍然覺得WCF還有更多的內容值得探索與挖掘。學得越多,反而越發覺得自己所知太少,直到現在,我也認為自己不過是初窺WCF的門徑而已。 學以致用”,如果僅僅是希望能夠在項目中合理地應用WCF,那么對于程序員而言,可以有兩種選擇,一種是“知其然而不知其所以然”,只要掌握了WCF的基礎知識,那么對于一般的應用就足夠了。要做到這一點就很容易了,微軟秉承了一貫的方式,將WCF這門技術優雅地呈現給開發者,封裝了復雜的實現邏輯,提供了易于調用的類庫和相關的工具,使得開發者能夠快速地完成WCF程序的開發。另外一種方式自然就是深度挖掘WCF的內部實現了,這是對WCF專家提出的要求。如果我們要應用WCF實現SOA解決方案,就會遭遇許多WCF的高級應用,如何合理、有效地應用WCF,并根據項目實際情況對WCF進行擴展,就成為了WCF專家必須解決的難題。 因此,如果要學習WCF,你必須找準自己學習的動機與目標,然后合理地安排自己的學習進度表,這才是正確的學習方式。本文試圖對WCF的一些基礎概念作一些試探性的闡述與分析,并以問答的方式組織,希望能夠部分解答一些希望學習WCF,但猶自徘徊在門外的開發者。 1、WCF是什么? 從WCF所處的位置來看,它是包含在.NET 3.0(也包括.NET 3.5)之中的。我們注意比較.NET 3.0與.NET 2.0,其實唯一的區別就是.NET 3.0包含了WCF、WPF、WF(或者還有CardSpace)而已。因此,我們認為WCF是.NET框架的一部分,似乎并不為過。尤為關鍵的是,WCF并不能脫離.NET框架而單獨存在(但非WCF客戶端可以調用WCF服務),因此,雖然WCF是微軟用以應對SOA解決方案的開發需求而專門推出的,但它并不是例如Spring、Struts那樣的框架,也不是像EJB那樣的容器或者服務器。微軟真正符合SOA企業應用服務器角色的,我想應該是Biztalk Server。 嚴格的說,WCF就是專門用于服務定制、發布與運行以及消息傳遞和處理的一組專門類的集合,也就是所謂的“類庫”。這些類通過一定方式被組織起來,共同協作,并為開發者提供了一個統一的編程模式。WCF之所以特殊,是在于它所應對的場景與普通的.NET類庫不同,它主要用于處理進程間乃至于機器之間消息的傳遞與處理,同時它引入了SOA的設計思想,以服務的方式公布并運行,以方便客戶端跨進程和機器對服務進行調用。實際上,WCF就是微軟對于分布式處理的編程技術的集大成者,它將DCOM、Remoting、Web Service、WSE、MSMQ集成在一起,從而降低了分布式系統開發者的學習曲線,并統一了開發標準。 WCF與其它類庫還有不同的地方,則在于WCF充分地體現了運行時環境的概念。對于早期使用WCF的開發人員而言,就可能知道如果在.NET 2.0下要開發WCF,還需要專門下載一個Runtime Component 3.0版,其中就包含了WCF、WF等內容。在.NET中一貫存在所謂“宿主”的概念,整個.NET Framework(或者說是CLR)就可以認為是一個大的宿主,就像Java的虛擬機一樣。由于WCF對服務有著專門的需求,對于服務端,需要發布和運行服務;對于客戶端,則需要調用服務;因而對于開發者,就需要編寫定義、發布、運行、調用服務的相關代碼。而服務就只能運行在特定的宿主上,這些宿主可以是控制臺應用程序進程、Windows或Web應用程序進程,也可以是Windows服務進程,或者為最常用的IIS宿主。在宿主內部,則封裝了通道堆棧,其中又包含了對協議、編碼、消息傳輸、代理的處理。而在通道層的頂部,還提供了一個高級運行時,以針對應用程序的開發人員。 因而,我們可以這樣認為,WCF是.NET Framework 3.x的一部分,它包含了用于服務定制、發布與運行以及消息傳遞和處理的運行時環境以及相關類的集合,它提供了在Windows平臺下開發和部署服務的SDK。大致組成如下圖所示: 2、WCF是怎樣運行的? 如果從宏觀的角度來分析WCF的運行機制,它的實現并不復雜。WCF的體系架構是基于一種攔截機制來實現的,負責傳遞和攔截消息的組件為通道,在客戶端發出對服務端服務的調用時,首先會通過一個服務代理對象,將調用方提供的對象序列化到消息中,然后該消息則通過通道進行傳遞。通道不只是包括一個,而是多個通道對消息進行處理,包括傳輸、消息編碼、管理會話、傳播事務等,但最底層的通道總是傳輸通道。這些通道的構成形成了一個通道堆棧。由于對象已經被序列化,因而此時通道傳遞的消息可以跨進程或機器進行傳遞,利用傳輸通道傳遞到服務端。服務端的構成與客戶端基本相似,仍然是通過通道棧中最底層的傳輸通道接收消息,然后解析消息編碼,并一層層地往上傳輸。在服務端的通道棧之上,則是一個分發器(Dispatcher,或者說是調度器),它會首先對消息進行檢查,然后選擇一個客戶端要調用的操作。在這個過程中,消息會被反序列化。 下圖說明了WCF的整個運行過程: 由于WCF通過通道的方式傳遞消息,整個通道同時擔當了偵聽器和攔截器的功能,它可以根據服務的定義,在方法執行的前或后執行不同的操作,例如事務、會話管理、安全等。這些操作在WCF中,大多數都可以以Attribute的方式應用到服務契約上,這樣的實現方式,就類似于采用了AOP(面向服務編程)的方法為服務提供了大量的基礎功能,有助于簡化服務開發者的工作。 3、為什么我們要選用WCF?在Windows平臺下,尤其是在.NET平臺下開發面向服務的應用程序,或者開發分布式系統,最佳選擇就是WCF。為什么呢?原因就在于WCF涵蓋了之前微軟推出的所有用于分布式開發的技術,包括Remoting、Web Services、WSE、MSMQ等,并以一種統一的編程模式來實現。 WCF既支持具有互操作性的Web服務,也能夠實現.NET客戶端與.NET服務端的通信,提供了分布式事務的支持,同時在安全性上,它完全遵循了WS-*的標準,此外,它還支持隊列服務,可以非常方便地利用消息隊列完成異步操作與脫機調用。而這些功能,以前的技術都只是部分的實現。如下表所示: 特性 Web Service .NET Remoting Enterprise Services WSE MSMQ WCF 具有互操作性的Web服務 支持 支持 .NET到.NET的通信 支持 支持 分布式事務 支持 支持 支持WS標準 支持 支持 消息隊列 支持 支持 WCF同時也使得面向服務編程更加簡單而統一了。如果采用舊有的技術,由于各種技術的編程模型完全不一致,使得程序的遷移非常的困難。例如,最初采用.NET Remoting技術開發的分布式系統,由于業務需求的變化,要求發布具有互操作性的Web服務,就需要重新定義服務。并且,客戶端的調用方式也發生了變化,需要添加Web引用,通過UDDI去發現服務。 采用WCF則不然。WCF引入了用通道,它封裝了消息的通信細節,例如編碼、事務處理、安全等,然后又通過引入綁定的概念,封裝了通道的組成順序與處理細節。最后,引入了獨有的Endpoint元素,集成了地址、綁定和契約之間的“三位一體”,以最簡單的方式定義和發布服務。 每種綁定對應不同的傳輸協議、消息編碼格式和版本以及安全、可靠性和事務模式。WCF也提供了擴展綁定的方式,例如通過CustomBinding或者定義派生與Binding的類。 WCF的契約包括服務契約、數據契約和消息契約(特別的,還包括了錯誤契約,用于異常的處理)。其中服務契約為面向服務應用程序的核心,通過它可以定義服務。數據契約則為服務所要傳遞的數據。由于服務的調用需要跨進程或機器進行通信,就需要服務數據必須能夠被序列化和反序列化。雖然.NET本身提供了數據的序列化功能,但WCF的數據契約更加符合服務數據的定義習慣。至于消息契約,則可以將服務數據定義為消息,包括XML文本格式、MTOM(消息傳輸優化機制)格式和二進制格式。 綁定(Binding)、契約(Contract)與服務的地址(Address)組合在一起,則形成了終結點(Endpoint),如下圖所示: Address是Endpoint的網絡地址,它標記了消息發送的目的地。Binding描述的是如何發送消息,例如消息發送的傳輸協議(如TCP,HTTP),安全(如SSL,SOAP消息安全)。Contract則描述的是消息所包含的內容,以及消息的組織和操作方式,例如是單向,雙向還是請求/響應方式。 引入終結點可以說是WCF的一個偉大創舉,通過它使得我們能夠更加容易的發布和管理服務,尤其是發布和管理多個服務。每個服務必須至少擁有一個終結點,而客戶端正是通過終結點知道服務的相關信息,例如地址、消息編碼格式、傳輸協議以及服務的內容,然后在進行正確的調用。最特別的是,同一個服務可以定義多個終結點,每個終結點可以是不同的地址、不同的綁定方式,以便于滿足多個客戶端的不同需要。而對于服務的發布者而言,我們只需要管理終結點的配置,就可以完成對服務的管理,這也為服務的托管提供了便利。 5、WCF主要包含哪些內容? Juval的《Programming WCF Services》一書基本已經涵蓋了WCF技術的方方面面。概括來講,主要包括綁定、服務契約、數據契約、消息傳遞、異常處理、實例模式、并發處理、事務處理、安全以及隊列服務等。 綁定屬于WCF基本的技術要素,是WCF進行通信處理的基礎。了解綁定的相關知識,有助于開發WCF應用程序。因為在不同的業務需求下,可能對通信方式、協議、消息編碼等多個方面會有不同的要求。在配制、發布和運行服務時,都需要對綁定進行操作。因而,我們必須掌握WCF內置綁定的相關屬性,熟悉綁定元素的相關配置。此外,在一些高級應用上,我們還要掌握自定義綁定的方式,了解在自定義綁定時,添加綁定元素的方式與順序,了解Binding基類的相關屬性和方法。以及與綁定配置相關的類。 服務契約是WCF的主要處理對象,服務的定義和設置正是通過服務契約實現的。除了了解ServiceContract和OperationContract的基礎應用之外,還需要比較WCF服務編程與普通的.NET編程之間的區別,例如服務的繼承與多態是怎樣實現的。最重要的是如何根據SOA的思想劃分服務的邊界,確定服務的粒度大小,這需要從系統的易用性、可擴展性、性能等多個方面進行權衡。 服務契約中關于操作的定義要受到很多約束,其中最重要的就是對數據的處理,這也是WCF引入數據契約的目的。由于WCF的特殊性,因而我們需要了解一些特殊數據類型的序列化方式,例如泛型類型、集合、DataSet等。 約束服務操作定義的還包括對異常的處理,WCF對異常有一套特殊的處理方式,可以根據實際的情況,確定異常消息是否需要進行通信,以及出現異常時,是否要求停止服務實例,或繼續維持會話。 WCF為消息傳遞提供了非常大的靈活性。它提供了專門的Message類以及相關的讀寫器,例如XmlDictionaryReader和XmlDictionaryWriter等對消息進行讀寫,這其中包含了對消息版本、編碼格式、消息標頭和正文等的操作。同時,WCF還提供了消息與方法之間的映射。在提供系統的互操作性時,了解WCF的消息傳遞方式很有必要。 根據不同的需求,WCF將實例模式分為PerCall,Single和PerSession三種方式。通過設置服務行為的InstanceContextMode屬性,來管理服務實例的生存周期,可以簡化開發人員的工作。我們只需要了解這三種實例模式的特性即可。通常情況下,我建議服務采用PerCall模式,如果需要維持服務與客戶端之間的會話,則可以采用PerSession模式。只有在對性能和可伸縮性沒有太大要求的情況下,才可以采用Single模式。 關于事務處理、并發處理以及安全,主要都是通過相關的服務行為進行設置和管理。這些內容都是WCF高級應用所必需掌握的內容,尤其對于開發企業級應用系統而言。至于隊列服務,主要是利用了消息隊列,以實現系統可以脫機訪問服務,并保持服務狀態的同步。 6、WCF主用適用于哪些應用場景? WCF本身就是微軟為了應對SOA戰略所推出的一套基于.NET Framework下的SDK。當我們在Windows平臺下,基于.NET框架開發一套系統,同時要求這套系統需要與其它平臺例如WebLogic、WebSphere或者JBoss進行交互時,就需要采用WCF技術了。這是因為WCF的互操作性所決定的。 目前來看,WCF在企業應用中還沒有得到大量的應用,但隨著開發者對.NET 3.x的深入了解,WCF會逐漸深入人心。由于WCF集成了.NET編程開發的習慣,對于.NET開發人員而言,就大大地降低了學習曲線,此外,WCF保留了對舊有技術包括Web Service、.NET Remoting、MSMQ、WSE的支持,同時對于舊有技術到WCF的遷移也提供了非常好的解決方案。因而,如果.NET人員若要應用SOA的解決方案,那么WCF無疑就是最佳選擇。單以開發而論,利用WCF定義服務、公開服務以及運行服務,利用WF實現工作流的設計、運行與管理、利用WPF作為具有豐富表現的富客戶端,或者通過AJAX+SliverLight開發調用WCF服務的客戶端,以及通過CardSpace完成對服務安全的設置與管理,就足以實施一整套的SOA解決方案。同時,WCF還可以結合Biztalk以及Sharepoint,使得SDK能夠搭載于應用服務器之上,更大程度地滿足企業應用的需要。 除了實施SOA解決方案之外,WCF對于開發分布式系統而言,也是得天獨厚的。當我們的應用系統需要在多個服務器上運行不同服務,以支撐大量的訪問負荷、大數據量處理、數據挖掘等工作時,就可以利用WCF開發不同的服務,然后托管在不同的服務器上,此時,整個系統就可以有效地利用服務器資源,減輕系統負荷。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的WCF 入门 WCF基础知识问与答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年党课ppt课件下载(2021年
- 下一篇: 什么是WCF?