挖掘WCF擴(kuò)展兩方面分析
大家知道嗎、隨著WCF技術(shù)的提高,WCF提供了許多擴(kuò)展點(diǎn),供開(kāi)發(fā)人員自定義運(yùn)行時(shí)行為,從而實(shí)現(xiàn)服務(wù)調(diào)度和客戶(hù)代理調(diào)用。經(jīng)過(guò)我的努力學(xué)習(xí),在這里和大家一起分享一下吧。您可以通過(guò)編寫(xiě)能以聲明方式應(yīng)用到服務(wù)中的自定義行為來(lái)使用這些擴(kuò)展點(diǎn) 。WCF 在通道層的頂部還提供了一個(gè)高級(jí)運(yùn)行時(shí),主要是針對(duì)應(yīng)用程序開(kāi)發(fā)人員。在 WCF 文檔中,它常被稱(chēng)為服務(wù)模型層。該高級(jí)運(yùn)行時(shí)主要由一個(gè)稱(chēng)作調(diào)度程序(在服務(wù)主機(jī)上下文中)的組件和一個(gè)稱(chēng)作代理(在客戶(hù)端上下文中)的組件組成。
#T#調(diào)度程序/代理組合的主要作用是在 WCF 消息對(duì)象和 .NET Framework 方法調(diào)用間進(jìn)行轉(zhuǎn)換)。這些組件按照一系列明確定義的步驟來(lái)執(zhí)行此過(guò)程,并在此過(guò)程的每個(gè)步驟中都提供了可供插入的擴(kuò)展點(diǎn)。您可以使用這些擴(kuò)展點(diǎn)來(lái)實(shí)現(xiàn)各種自定義行為,包括消息或參數(shù)驗(yàn)證、消息日志記錄、消息轉(zhuǎn)換、自定義序列化/反序列化格式、輸出緩存、對(duì)象共用、錯(cuò)誤處理和授權(quán)等.
1.調(diào)度程序/代理WCF擴(kuò)展
調(diào)度程序和代理都提供了大量的擴(kuò)展點(diǎn),您可以在其中插入自己的代碼;這些擴(kuò)展常被稱(chēng)為偵聽(tīng)器,因?yàn)樗鼈冊(cè)试S您偵聽(tīng)默認(rèn)的運(yùn)行時(shí)執(zhí)行行為。不過(guò),我通常稱(chēng)它們?yōu)檫\(yùn)行時(shí)擴(kuò)展。顯示了客戶(hù)端代理體系結(jié)構(gòu)及可用的擴(kuò)展點(diǎn)。代理的主要作用是將調(diào)用方提供的對(duì)象(參數(shù))轉(zhuǎn)換為 WCF 消息對(duì)象,然后將后者提供給底層通道堆棧進(jìn)行網(wǎng)絡(luò)傳輸。
可以通過(guò) ClientOperation 和 ClientRuntime 對(duì)象在代理上配置這些擴(kuò)展。您可以找到一個(gè)用于各種服務(wù)操作的 ClientOperation 對(duì)象和一個(gè)用于從整體上配置代理的 ClientRuntime 對(duì)象。ClientOperation 提供了用于管理參數(shù)檢查和消息格式化擴(kuò)展的屬性,而 ClientRuntime 則提供了用于管理消息檢查擴(kuò)展的屬性。
當(dāng)調(diào)度程序收到來(lái)自通道堆棧的 Message 對(duì)象時(shí),遇到的第一個(gè)擴(kuò)展點(diǎn)便是消息檢查。然后,調(diào)度程序必須選擇一個(gè)要調(diào)用的操作,然后才能繼續(xù) — 這里有一個(gè)擴(kuò)展點(diǎn)用于覆蓋默認(rèn)的操作選擇行為。確定目標(biāo)操作后,調(diào)度程序會(huì)將消息反序列化為調(diào)用目標(biāo)方法時(shí)可作為參數(shù)提供的對(duì)象。此時(shí),調(diào)度程序提供用于進(jìn)行消息格式化(反序列化)和參數(shù)檢查的擴(kuò)展點(diǎn)。調(diào)度程序的最后一步是調(diào)用提供就緒參數(shù)的目標(biāo)方法。您甚至可以通過(guò)提供自定義的操作調(diào)用程序?qū)ο髞?lái)替代這一步。
可以通過(guò) DispatchRuntime 和 DispatchOperation 對(duì)象在調(diào)度程序上配置這些擴(kuò)展。稍后我將簡(jiǎn)要介紹如何訪(fǎng)問(wèn)這些對(duì)象,不過(guò),首先讓我們討論一下如何實(shí)現(xiàn)它們。
2 實(shí)現(xiàn)自定義WCF擴(kuò)展
上述的每個(gè)WCF擴(kuò)展點(diǎn)都是根據(jù) .NET 接口定義來(lái)模擬的。注意,在某些情況下,相同的邏輯擴(kuò)展類(lèi)型要求在調(diào)度程序和代理端之間使用另一接口。下面我將詳細(xì)介紹如何實(shí)現(xiàn)其中的部分接口。
消息檢查器:不管是什么操作,假設(shè)您要檢查的是流入和流出服務(wù)的消息,而不是參數(shù)。在這種情況下,您需要使用消息檢查擴(kuò)展點(diǎn)。與參數(shù)檢查不同,此時(shí)用于調(diào)度程序和代理(分別是 IDispatchMessageInspector 和 IClientMessageInspector)的消息檢查接口是不同的。不過(guò),當(dāng)需要支持兩端時(shí),始終可以實(shí)現(xiàn)這兩個(gè)接口。
IDispatchMessageInspector 有兩個(gè)方法:AfterReceiveRequest 和 BeforeSendReply,這樣您就有前偵聽(tīng)點(diǎn)和后偵聽(tīng)點(diǎn)來(lái)檢查 WCF 消息對(duì)象了。IClientMessageInspector 還有兩個(gè)提供相反點(diǎn)的方法:AfterReceiveReply 和 BeforeSendRequest。