WCF入門教程:WCF基礎知識問答(轉)

來源:互聯網
上載者:User

標籤:blog   http   java   使用   strong   資料   

學習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開發不同的服務,然後託管在不同的伺服器上,此時,整個系統就可以有效地利用伺服器資源,減輕系統負荷。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.