深入挖掘WCF綁定原理
WCF經(jīng)過長(zhǎng)時(shí)間的發(fā)展,越來越多的人在使用它,所謂知識(shí)就是財(cái)富,這里把我的財(cái)富分享給大家。WCF綁定屬于WCF基本的技術(shù)要素,是WCF進(jìn)行通信處理的基礎(chǔ)。了解綁定的相關(guān)知識(shí),有助于開發(fā)WCF應(yīng)用程序。因?yàn)樵诓煌臉I(yè)務(wù)需求下,可能對(duì)通信方式、協(xié)議、消息編碼等多個(gè)方面會(huì)有不同的要求。在配制、發(fā)布和運(yùn)行服務(wù)時(shí),都需要對(duì)綁定進(jìn)行操作。因而,我們必須掌握WCF內(nèi)置綁定的相關(guān)屬性,熟悉綁定元素的相關(guān)配置。此外,在一些高級(jí)應(yīng)用上,我們還要掌握自定義綁定的方式,了解在自定義綁定時(shí),添加綁定元素的方式與順序,了解Binding基類的相關(guān)屬性和方法。以及與綁定配置相關(guān)的類。WCF綁定(Binding)、契約(Contract)與服務(wù)的地址(Address)組合在一起,則形成了終結(jié)點(diǎn)(Endpoint)。
#T#Address 是Endpoint的網(wǎng)絡(luò)地址,它標(biāo)記了消息發(fā)送的目的地。Binding描述的是如何發(fā)送消息,例如消息發(fā)送的傳輸協(xié)議(如TCP,HTTP),安全(如SSL,SOAP消息安全)。Contract則描述的是消息所包含的內(nèi)容,以及消息的組織和操作方式,例如是單向,雙向還是請(qǐng)求/響應(yīng)方式。引入終結(jié)點(diǎn)可以說是WCF的一個(gè)偉大創(chuàng)舉,通過它使得我們能夠更加容易的發(fā)布和管理服務(wù),尤其是發(fā)布和管理多個(gè)服務(wù)。每個(gè)服務(wù)必須至少擁有一個(gè)終結(jié)點(diǎn),而客戶端正是通過終結(jié)點(diǎn)知道服務(wù)的相關(guān)信息,例如地址、消息編碼格式、傳輸協(xié)議以及服務(wù)的內(nèi)容,然后在進(jìn)行正確的調(diào)用。最特別的是,同一個(gè)服務(wù)可以定義多個(gè)終結(jié)點(diǎn),每個(gè)終結(jié)點(diǎn)可以是不同的地址、不同的WCF綁定方式,以便于滿足多個(gè)客戶端的不同需要。而對(duì)于服務(wù)的發(fā)布者而言,我們只需要管理終結(jié)點(diǎn)的配置,就可以完成對(duì)服務(wù)的管理,這也為服務(wù)的托管提供了便利。
服務(wù)契約是WCF的主要處理對(duì)象,服務(wù)的定義和設(shè)置正是通過服務(wù)契約實(shí)現(xiàn)的。除了了解 ServiceContract和OperationContract的基礎(chǔ)應(yīng)用之外,還需要比較WCF服務(wù)編程與普通的.NET編程之間的區(qū)別,例如服務(wù)的繼承與多態(tài)是怎樣實(shí)現(xiàn)的。最重要的是如何根據(jù)SOA的思想劃分服務(wù)的邊界,確定服務(wù)的粒度大小,這需要從系統(tǒng)的易用性、可擴(kuò)展性、性能等多個(gè)方面進(jìn)行權(quán)衡。
服務(wù)契約中關(guān)于操作的定義要受到很多約束,其中最重要的就是對(duì)數(shù)據(jù)的處理,這也是WCF引入數(shù)據(jù)契約的目的。由于WCF的特殊性,因而我們需要了解一些特殊數(shù)據(jù)類型的序列化方式,例如泛型類型、集合、DataSet等。約束服務(wù)操作定義的還包括對(duì)異常的處理,WCF對(duì)異常有一套特殊的處理方式,可以根據(jù)實(shí)際的情況,確定異常消息是否需要進(jìn)行通信,以及出現(xiàn)異常時(shí),是否要求停止服務(wù)實(shí)例,或繼續(xù)維持會(huì)話。WCF 為消息傳遞提供了非常大的靈活性。它提供了專門的Message類以及相關(guān)的讀寫器,例如XmlDictionaryReader和 XmlDictionaryWriter等對(duì)消息進(jìn)行讀寫,這其中包含了對(duì)消息版本、編碼格式、消息標(biāo)頭和正文等的操作。同時(shí),WCF還提供了消息與方法之間的映射。在提供系統(tǒng)的互操作性時(shí),了解WCF的消息傳遞方式很有必要。
根據(jù)不同的需求,WCF將實(shí)例模式分為 PerCall,Single和PerSession三種方式。通過設(shè)置服務(wù)行為的InstanceContextMode屬性,來管理服務(wù)實(shí)例的生存周期,可以簡(jiǎn)化開發(fā)人員的工作。我們只需要了解這三種實(shí)例模式的特性即可。通常情況下,我建議服務(wù)采用PerCall模式,如果需要維持服務(wù)與客戶端之間的會(huì)話,則可以采用PerSession模式。只有在對(duì)性能和可伸縮性沒有太大要求的情況下,才可以采用Single模式。
關(guān)于事務(wù)處理、并發(fā)處理以及安全,主要都是通過相關(guān)的服務(wù)行為進(jìn)行設(shè)置和管理。這些內(nèi)容都是WCF高級(jí)應(yīng)用所必需掌握的內(nèi)容,尤其對(duì)于開發(fā)企業(yè)級(jí)應(yīng)用系統(tǒng)而言。至于隊(duì)列服務(wù),主要是利用了消息隊(duì)列,以實(shí)現(xiàn)系統(tǒng)可以脫機(jī)訪問服務(wù),并保持服務(wù)狀態(tài)的同步。