細算起來,已經有好幾個月沒有真正的寫過文章了。近半年以來,一直忙於我的第一本WCF專著《WCF技術剖析》的寫作,一直無暇管理自己的Blog。到目前為止《WCF技術剖析(卷1)》的寫作暫告一段落,初步預計於下個月由武漢博文視點出版。在《WCF技術剖析》寫作期間,對WCF又有了新的感悟,為此以書名開始本人的第三個WCF系列。本系列的目的在於對《WCF技術剖析》的補充,會對書中的一些內容進行展開講述,同時會囊括很多由於篇幅的原因忍痛割棄的內容。
本系列的第一篇,我將會對WCF的基本架構作一個大致的講解。不過,一改傳統對WCF的工作流程進行平鋪直敘,我將另闢蹊徑,藉助於我們熟悉的ASP.NET作為請求處理平台,通過一個簡單的託管程式類比整個WCF用戶端和服務端的架構。
WCF架構處理流程和涉及的組件
我們的類比程式將你搭建一個迷你版的WCF架構,為了展示WCF整個處理流程中使用到一些特殊組件。我們首先來簡單介紹一下對於一個簡單的WCF服務調用,WCF的用戶端和服務端架構的處理流程,和該流程的每一個階段都使用那些重要組件。
下面的列表列出了WCF服務端架構對於處理一個簡單的WCF服務調用請求所提供的功能,以及相應的功能承載的組件:
請求訊息的接收和回複訊息的發送:服務端在傳輸層監聽與接收來自客戶的請求,並將經過編碼後的回複訊息通過傳輸層發送到用戶端
請求訊息的解碼和回複訊息的編碼:將接收到的位元組數組通過解碼產生請求訊息對象,並將回複訊息通過編程轉化成位元組組。訊息的編碼和解碼通過MessageEncoder完成,而MessageEncoderFactory負責建立該對象
請求訊息的還原序列化和回複訊息的序列化:對請求訊息進行還原序列化,為服務作業的執行產生相應的輸入參數,以及將服務作業執行的結果(傳回值或者ref/out參數)序列化,並產生回複訊息。序列化和還原序列化通過DispatchMessageFormatter完成
服務物件的建立:建立或者啟用服務物件執行個體,InstanceProvider用於服務物件的建立或擷取
服務作業的執行:調用建立的服務物件的操作方法,並傳入經過還原序列化產生的輸入參數。OperationInvoker完成對服務作業的最終執行
較之服務端的流程,用戶端的流程顯得相對簡單,僅僅包含以下三個必需的階段:
請求訊息的序列化和回複訊息的還原序列化:產生請求訊息並將輸入參數序列化到請求訊息中,以及對回複訊息進行還原序列化,轉化成方法調用的傳回值或者ref/out參數。序列化和還原序列化通過ClienthMessageFormatter完成
請求訊息的編碼和回複訊息的解碼:對請求訊息進行編碼產生位元組數組供傳輸層發送,以及將傳輸層接收到的位元組數組解碼產生恢複訊息。訊息的編碼和解碼通過MessageEncoder完成,而MessageEncoderFactory負責建立該對象
請求訊息的發送和回複訊息的接收:在傳輸層將經過編碼的請求訊息發送到服務端,以及將接收來自服務端的恢複訊息
圖1 精簡版WCF用戶端與服務端組件
圖1反映了進行服務調用的必要步驟和使用到的相關WCF組件。在本案例示範中,我們需要做的就是手工建立這些組件,並通過我們自己的代碼利用它們搭建一個簡易版的WCF架構。如果讀者能夠對本案例的實現有一個清晰的理解,相信對於整個WCF的架構就不會感到陌生了。
圖2顯示了本結案方案的基本結構,總共分三個項目。Contracts用於定義服務契約,被服務端和用戶端引用。用戶端通過一個Console應用類比,而服務端則通過一個ASP.NET Website實現。
圖2 WCF架構類比案例應用結構