行為擴充套件Behavior Extension,使用自定義行為擴充套件Service Model
1 引言
WCF是一個極具可擴充套件性的分佈是訊息通訊框架。
對於WCF的一些基本概念不在本文的內容中詳細介紹,本文基於你對WCF有一定的認識,並對於其中的基本概念已經有一定的理解。
2 行為擴充套件
2.1 行為相關的流程
上圖是客戶端的行為相關的一個流程,也可以看做是一個客戶端的呼叫之後,資料流程。
每個Endpoint對應一個Client Runtime Component,每個Client Runtime Component有多個Client Operation Runtime Component,每個Client Operation Runtime Component又對應一個Endpont’s Contract的方法。
呼叫一個wcf方法之後,Client Operation Runtime Component負責序列化提交的資料(將來還會反序列化服務端響應的資料),經過Client Runtime Component向上傳遞,最終傳遞給WCF Channel Layer。
上圖是一個服務端的行為流程。主要引數的元件是Dispatcher元件。它負責接收client的請求訊息,傳遞給適當的服務去處理。
如圖,有三種dispatcher。Channel Dispatcher,Endpoint Dispatcher,Operation Dispatcher。它們的職責都在圖中有標識。
2.2 擴充套件步驟
用自定義的行為擴充套件client runtime component和dispatcher,通常有三個步驟。
2.2.1 宣告你要提供的行為屬於什麼型別
首先要宣告這個自定義行為的型別。是工作在客戶端,用來向訊息中新增序列化之後的提交到伺服器的資料?還是工作在服務端,用來管理服務型別的例項?通過實現適當的介面,這一步很容易實現。這些介面大多定義在System.ServiceModel.Dispatcher名稱空間中。
假如要自定義一個工作在客戶端的行為,功能是自定義資料的序列化過程。實現IClientMessageFormatter介面,實現裡面的序列化和反序列化方法就可以了。
假如要自定義一個工作在服務端的行為,功能是管理服務型別的例項。實現IInstanceProvider介面就可以了。
在客戶端,和客戶端執行時相關的兩個類是:
1 System.ServiceModel.Dispatcher.ClientOperation
代表operation操作層面的執行時。
System.ServiceModel.Dispatcher.ClientOperation有兩個屬性可以附加操作型別的行為。
1)ParameterInspectors,是System.ServiceModel.Dispatcher.IParameterInspector物件的集合。因此,你可以建立自己的引數Inspector行為,可以檢查和隨意的修改傳入傳出的資料。
2)Formatter,實現IClientMessageFormatter介面的物件可以賦值給這個屬性。用來將傳遞給服務端的資料序列化到訊息中,更精確的說是System.ServiceModel.Channels.Message型別的物件中。
2 System.ServiceModel.Dispatcher.ClientRuntime
代表endpoint層面的執行時。有兩個屬性可以附加endpoint行為。
1)OperationSelector,實現System.ServiceModel.Dispatcher.IClientOperationSelector 介面的物件可以賦值給這個屬性。用來決定一個請求分配到服務的那個方法上。
2)MessageInspectors,實現System.ServiceModel.Dispatcher.IClientMessageInspector介面的物件集合。可以檢查,隨意修改請求和響應的訊息。可以拷貝一份提交的訊息,以後可以做審計功能。
在服務端,和dispatcher相關的有三個類。
1 System.ServiceModel.Dispatcher.DispatchOperation
代表operation操作相關的dispatcher類。有三個屬性可以附加操作相關的行為。
1)Formatter,實現介面System.ServiceModel.Dispatcher.IDispatchMessageFormatter 的物件。將傳入到服務端的訊息反序列化為資料,將輸出到客戶端的響應序列化到訊息中。
2)ParameterInspectors,是System.ServiceModel.Dispatcher.IParameterInspector物件的集合。這些物件可以檢查,隨意修改從dispatcher message formatter傳入的反序列化的資料,和傳出去的響應資料。
3)Invoker,實現System.ServiceModel.Dispatcher.IOperationInvoker的物件。用來執行服務的實現(服務的介面實現)操作,將由輸入訊息反序列化產生的資料傳遞過去。
2 System.ServiceModel.Dispatcher.DispatchRuntime
代表endpoint層面的元件。有下面的幾個可以附件行為的屬性。
1)InstanceContextProvider,實現System.ServiceModel.Dispatcher.IInstanceContextProvider 介面的物件。用來管理狀態資訊。
2)OperationSelector,實現System.ServieModel.Dispatcher.IDispatchOperationSelector介面的物件,根據請求訊息中的地址,將訊息分配到適當的操作。
3)MessageInspectors,實現System.ServiceModel.Dispatcher.IDispatchMessageInspector介面的物件,用來附件一個訊息檢查器,檢查輸入的請求訊息。
4)InstanceProvider,實現System.ServiceModel.Dispatcher.IInstanceProvider介面的物件,用來管理服務的型別。
3 System.ServiceModel.Dispatcher.ChannelDispatcher
下面是客戶端呼叫一個服務之後,事件的發生順序。
- 客戶端的operation selector根據客戶端執行的方法決定請求服務端的哪個operation。
- 掛在client runtime components上的parameter inspactors檢查客戶端的呼叫引數,也可以修改客戶端的呼叫引數。parameter inspactor用來驗證傳出到服務端的資料是否在合法的範圍,如果不在可以修改它。也可以將資料項轉變為特定的值。
- 客戶端的message formatter將資料項序列化為xml,放入到wcf的訊息中。
- System.ServiceModel.Channel.Message代表傳遞到endpoint level的client runtime components的訊息。
- 客戶端的message inspactor檢查,隨意修改System.ServiceModel.Channel.Message物件。
- 訊息傳輸到WCF的Channel Layer。更準確的說法是,訊息傳遞到Channel Stack的頂層Channel。
- 訊息被服務接收,從Channel Layer傳遞到channel dispatcher,然後傳輸給適當的endpoint。
- instance context provider獲取狀態資訊。
- 根據訊息中的address,dispatch operation selector決定交給哪個operation。
- dispatch message inspactor可以檢查,隨意修改傳入的System.ServiceModel.Channel.Message物件。
- instance provider建立或者獲取的某一個服務的例項。
- 通過dispatch operaiton selector將訊息傳遞給dispatcher component。
- dispatch message formatter反序列化訊息中的body部分,放入資料項陣列中。
- dispatcher元件附加的parameter inspactor可以檢查,隨意修改資料項。
- operation invoker執行具體的服務實現,將反序列化的資料項傳遞給方法的引數。
- 如果方法有返回值,附加到dispatcher的parameter inspactor可以檢查,修改返回值。
- dispatch message formatter序列化返回值,放入System.ServiceModel.Channel.Message物件。
- 響應訊息傳遞給endpoint 層的dispatcher元件。
- dispatch message inspactor可以檢查,隨意修改響應訊息。
- instance context provider可以持久化,或者是拋棄狀態資訊。
- instance provider有機會處理掉它建立的服務的例項instance。
- 響應訊息傳遞到channel dispatcher,傳遞給最高層的channel。
- 響應訊息被客戶端接收,傳遞給客戶端的channel layer。
- 客戶端的message inspactor檢查,修改響應訊息。
- 客戶端的operation selector識別響應訊息中的操作。
- 響應訊息被傳遞到發出請求的那個操作。
- 客戶端的message formatter反序列化響應訊息的body部分,傳遞給資料項陣列。
- 這些資料項陣列會別傳遞給掛在client runtime的parameter inspactor,可以檢查和修改資料項。
- 程式設計師的程式碼使用資料項進行操作。