WCF擴充套件:行為擴充套件Behavior Extension

weixin_34377065發表於2010-10-27

 

行為擴充套件Behavior Extension,使用自定義行為擴充套件Service Model

 

1 引言

 

WCF是一個極具可擴充套件性的分佈是訊息通訊框架。

對於WCF的一些基本概念不在本文的內容中詳細介紹,本文基於你對WCF有一定的認識,並對於其中的基本概念已經有一定的理解。

2 行為擴充套件

 

2.1 行為相關的流程

WCF Client Behavior

 

上圖是客戶端的行為相關的一個流程,也可以看做是一個客戶端的呼叫之後,資料流程。

每個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。

 

WCF Server Behavior

 

上圖是一個服務端的行為流程。主要引數的元件是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

下面是客戶端呼叫一個服務之後,事件的發生順序。

  1. 客戶端的operation selector根據客戶端執行的方法決定請求服務端的哪個operation。
  2. 掛在client runtime components上的parameter inspactors檢查客戶端的呼叫引數,也可以修改客戶端的呼叫引數。parameter inspactor用來驗證傳出到服務端的資料是否在合法的範圍,如果不在可以修改它。也可以將資料項轉變為特定的值。
  3. 客戶端的message formatter將資料項序列化為xml,放入到wcf的訊息中。
  4. System.ServiceModel.Channel.Message代表傳遞到endpoint level的client runtime components的訊息。
  5. 客戶端的message inspactor檢查,隨意修改System.ServiceModel.Channel.Message物件。
  6. 訊息傳輸到WCF的Channel Layer。更準確的說法是,訊息傳遞到Channel Stack的頂層Channel。
  7. 訊息被服務接收,從Channel Layer傳遞到channel dispatcher,然後傳輸給適當的endpoint。
  8. instance context provider獲取狀態資訊。
  9. 根據訊息中的address,dispatch operation selector決定交給哪個operation。
  10. dispatch message inspactor可以檢查,隨意修改傳入的System.ServiceModel.Channel.Message物件。
  11. instance provider建立或者獲取的某一個服務的例項。
  12. 通過dispatch operaiton selector將訊息傳遞給dispatcher component。
  13. dispatch message formatter反序列化訊息中的body部分,放入資料項陣列中。
  14. dispatcher元件附加的parameter inspactor可以檢查,隨意修改資料項。
  15. operation invoker執行具體的服務實現,將反序列化的資料項傳遞給方法的引數。
  16. 如果方法有返回值,附加到dispatcher的parameter inspactor可以檢查,修改返回值。
  17. dispatch message formatter序列化返回值,放入System.ServiceModel.Channel.Message物件。
  18. 響應訊息傳遞給endpoint 層的dispatcher元件。
  19. dispatch message inspactor可以檢查,隨意修改響應訊息。
  20. instance context provider可以持久化,或者是拋棄狀態資訊。
  21. instance provider有機會處理掉它建立的服務的例項instance。
  22. 響應訊息傳遞到channel dispatcher,傳遞給最高層的channel。
  23. 響應訊息被客戶端接收,傳遞給客戶端的channel layer。
  24. 客戶端的message inspactor檢查,修改響應訊息。
  25. 客戶端的operation selector識別響應訊息中的操作。
  26. 響應訊息被傳遞到發出請求的那個操作。
  27. 客戶端的message formatter反序列化響應訊息的body部分,傳遞給資料項陣列。
  28. 這些資料項陣列會別傳遞給掛在client runtime的parameter inspactor,可以檢查和修改資料項。
  29. 程式設計師的程式碼使用資料項進行操作。

Technorati 標籤: WCF,Extension,Behavior

相關文章