前面的幾篇文章,分別介紹了WCF的基本知識和Endpoint的三個重要組成部分:Address,Contract,Binding。但無非管中窺豹而已,本文就闡述一下WCF的架構,從整體的角度來重新對WCF加深認識。
本文的出發點:
通過閱讀本文,能使您獲得以下知識:
WCF的架構圖
WCF架構的關鍵元素及其概念
創建一示例程序,並對其按架構圖進行解析
本文適合的讀者:
本文適合WCF初學者,以前可以對WCF一無所知,本文只作介紹,不涉及WCF技術具體技術難點和介紹。
WCF的架構圖
下圖為WCF的架構圖:
WCF架構的關鍵元素及其概念
Contracts and Description (協定和說明):
協定定義消息系統的各個方面。包括Data Contract(數據協定),Message Contract(消息協定) ,Service Contract(服務協定)。Data Contract是WCF中 Service與Client端之間用來交換的數據的格式定義,它采用Xml 架構定義語言(XSD)來定義,使得服務端和客戶端都能理解數據格式定義。消息協定能定義消息的特定部分,默認情況下 ,WCF的消息是由固定格式的,但某些情況下,也可以使用Message Contrace來自定義消息格式。服務協定指定服務端公開的方法簽名,這些方法能夠在遠程被調用。舉個國家和間諜的例子,A 是國家C派往其它國家的一名間諜,他負責收集情報,被通過某種特定的渠道,將獲得的情報發送給國家C,假如A在出去執行任務之前,國家C的特工部門為其編訂了一套密文,這個密文只有國家C和特工部門和A知道具體含義,這些密文正是在A與其國家之間進行傳遞的數據,國家C對密文的制定,正是WCF中對交換數據格式的定義,屬於Data Contract范疇,而A在獲得情報之後,通過電報的方式將情報發回給國家情報機關,它首先設置電報的發送地址並注明來源,並且將情報信息編碼成密文進行發送,對電報報文的格式定義就屬於Message Contract范疇,而國家情報機關為A要想接受和對A發送任務命令,必須也提供固定的通訊設施和人,這些能夠被A所聯絡上的通訊設施和人就屬於Service Contract的范疇。
Service Runtime(服務運行時)
上面說的協定是在開發wcf服務時候制定的,而服務運行時,是在服務實際運行時候地一些行為控制。ErrorBehavior是在服務出現錯誤的時候發生的操作,ThrottingBehavior能夠限制創建多少個實例和會話,通過這個您能夠控制WCF服務的性能,MetaBehavior(元數據行為)控制是否和如何向外部提供元數據。TransactionBehavior能定義事務性,使得當發生異常的時候能進行回滾。DispatchBehavior(調度行為)能控制WCF處理消息的方式,通過擴展性功能可以自定義運行時進程。 例如,消息檢查功能用於檢查消息的各個部分,使用參數篩選功能可以根據作用於消息頭的篩選器來執行預設操作。下圖顯示了WCF的消息處理流程
Messaging(消息傳遞)
在WCF中,消息是在通道(Channel)中進行傳遞的。通道是以某種方式對消息進行處理的組件 。一組通道可以組合成"通道堆棧",主要有兩大種通道:協議通道和傳輸通道。協議通道說明數據的格式和交換模式,WS-Security 是對在消息層啟用安全性的 WS-Security 規范的實現。 通過 WS-Reliable Messaging 通道可以保證消息的傳遞。 編碼器提供了大量的編碼,可使用這些編碼來滿足消息的需要。 HTTP 通道指定應使用超文本傳輸協議來傳遞消息。 同理,TCP 通道指定 TCP 協議。 事務流通道控制已經過事務處理的消息模式。 通過命名管道通道可以進行進程間通信。 使用 MSMQ 通道可以與 MSMQ 應用程序進行互操作。
Activation and Hosting(激活和承載)
WCF服務的最終形式仍然是程序,它能夠"自承載",也可以寄宿到其它應用程序之中 ,如IIS,Windows激活服務,Com+等。
創建一示例程序,並對其按架構圖進行解析
創建一個最簡單的WCF服務,並利用上述的架構對其解析
打開vs2008,創建一個Wcf Application,命名為WcfSample1 ,如下圖所示:
我們就利用系統模板產生的文件來進行解析,完成上步中,會自動產生如下的項目:
打開IService.cs,
為了簡單的闡述MessageContract,我們新建一個CustomMessage.cs,代碼如下:
為使用該服務,我們再創建一個ServiceContract接口和其具體實現,分別為:IMessagingHello.cs和MessageHello.svc
和
在web.config作如下的配置:
創建一個客戶端應用項目Client用於消費上面創建的服務,創建項目後,添加Service引用,如下圖所示:
分別添加對MessageHello.svc和Service1.svc的引用後,在programe.cs中添加如下代碼:
用tcpTrace來監聽自定義報文,可以得到
發送的消息報文為:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><HelloGreetingMessage xmlns="http://tempuri.org/"><Salutations xmlns="http://jillzhang.cnblogs.com">jillzhang</Salutations></HelloGreetingMessage></s:Body></s:Envelope>
而接受到消息報文為:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:OutOfBandData s:mustUnderstand="1" xmlns:h="http://jillzhang.cnblogs.com">Served by object 63334862.</h:OutOfBandData></s:Header><s:Body><HelloResponseMessage xmlns="http://tempuri.org/"><ResponseToGreeting xmlns="http://jillzhang.cnblogs.com">Service received: jillzhang</ResponseToGreeting></HelloResponseMessage></s:Body></s:Envelope>
從而可知MessageContract已經起了作用。
本文配套源碼