首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 服務模式核心:Dispatcher 架構與訊息分派管線深度解析

     編輯:關於.NET

Dispatcher:服務端訊息處理的中樞

WCF 服務模式遠比 Channel Layer 複雜。Dispatcher 不是單一物件,而是完成訊息分派功能的一組核心物件總稱:ChannelListener、ChannelDispatcher、EndpointDispatcher 及輔助物件。其核心任務:監聽 URI、接收訊息、分派至 Endpoint、關聯 InstanceContext、建立/重用服務實例、分派至具體作業、執行並序列化回應。

核心物件關係圖

  • ServiceHostBase (含 ServiceDescription) → 1..n ChannelDispatcher (對應不同 Listen URI)。
  • ChannelDispatcher → 1..n EndpointDispatcher (對應相同 URI 下不同 Endpoint)。
  • EndpointDispatcher ↔ DispatchRuntime (運行時行為定制中樞,Behavior 擴展主要作用目標)。

Dispatching Pipeline 20 步驟完整流程

  1. ServiceHost & ServiceDescription 建立:解析 Attribute/Config,建立 ServiceDescription (含 Behaviors、Endpoints、ContractDescription、OperationDescription)。
  2. Open() → ChannelListener & ChannelDispatcher 建立:依 Endpoint ListenUri/Mode 分組,透過 Binding 建立 ChannelListener,包裝成 ChannelDispatcher,同步建立 EndpointDispatcher + DispatchRuntime。
  3. 監聽與接收:ChannelListener 綁定 URI,AcceptChannel 建立 Channel 接收 Request Message。
  4. EndpointDispatcher 選擇:ChannelDispatcher 遍歷 EndpointDispatcher,依 AddressFilter (預設 EndpointAddressMessageFilter) 比對 Message To Header,優先級最高者勝出 (FilterPriority)。
  5. InstanceContext 取得:透過 InstanceContextProvider (GetExistingInstanceContext / InitializeInstanceContext) 依 Instancing Mode (PerCall/PerSession/Singleton) 關聯或建立 InstanceContext。
  6. DispatchOperation 選擇:DispatchRuntime.OperationSelector.SelectOperation 解析 Action Header,對應 DispatchRuntime.Operations 集合。
  7. OperationContext 初始化:設定 OperationContext.Current。
  8. Addressing 驗證:若 ManualAddressing=false,依 WS-Addressing 驗證 ReplyTo/FaultTo/From Header。
  9. MessageInspector 處理 Request:遍歷 DispatchRuntime.MessageInspectors 呼叫 AfterReceiveRequest。
  10. 釋放既有實例 (可選):若 DispatchOperation.ReleaseInstanceBeforeCall=true,呼叫 InstanceProvider.ReleaseInstance。
  11. 建立/取得服務實例:呼叫 InstanceProvider.GetInstance。
  12. CallContextInitializer 初始化 TLS:遍歷 DispatchOperation.CallContextInitializers 呼叫 BeforeInvoke。
  13. 反序列化輸入參數:若 DeserializeRequest=true,透過 DispatchOperation.Formatter.DeserializeRequest 產生參數陣列。
  14. ParameterInspector 驗證輸入:遍歷 ParameterInspectors 呼叫 BeforeCall (回傳 correlationState)。
  15. 執行服務作業:透過 IOperationInvoker.Invoke (同步) 或 InvokeBegin/End (非同步) 呼叫實際方法。
  16. ParameterInspector 驗證輸出:遍歷 ParameterInspectors 呼叫 AfterCall (傳入 correlationState)。
  17. 序列化回應:若 SerializeReply=true,透過 Formatter.SerializeReply 產生 Reply Message。
  18. CallContextInitializer 清理 TLS:遍歷 CallContextInitializers 呼叫 AfterInvoke。
  19. MessageInspector 處理 Reply:遍歷 MessageInspectors 呼叫 BeforeSendReply。
  20. Error Handling:遍歷 ChannelDispatcher.ErrorHandlers,HandleError 回傳 true 則停止;ProvideFault 產生自訂 Fault Message。
  21. 資源清理:釋放 Channel、InstanceContext 等資源。

關鍵設計細節補充

ServiceDescription 核心屬性

  • Behaviors:KeyedByTypeCollection<IServiceBehavior>,含 ServiceBehaviorAttribute 及自訂 Service Behavior。
  • Endpoints:ServiceEndpointCollection,每個 Endpoint 含 ABC + Behaviors + ListenUri/Mode。
  • ContractDescription:含 ContractType、Operations、SessionMode、Behaviors (ContractBehavior)。

MessageFilter 預設行為

EndpointDispatcher.AddressFilter = EndpointAddressMessageFilter (比對 To Header);ContractFilter = MatchAllMessageFilter。若多 Endpoint 符合,依 FilterPriority 決定。

InstanceContextProvider 三種內建實作

  • PerCall:GetExistingInstanceContext 永回 null,IsIdle 回 true。
  • PerSession:Session 已建立回既有 Context,否則 null;IsIdle 回 false。
  • Singleton:實例建立後後續請求回同一 Context;IsIdle 回 false。

自訂時建議繼承 InstanceContextProviderBase 而非直接實作介面。

OperationSelector

預設 System.ServiceModel.Channels.OperationSelector 回傳 Action Header 值,對應 DispatchOperation 名稱。

擴展點實戰對應

本系列後續文章即針對上述管線關鍵步驟實作擴展:

  • Step 10/11 InstanceProvider → Unity 整合、Policy Injection、物件池。
  • Step 9 MessageInspector → Context 傳遞。
  • Step 12/18 CallContextInitializer → Localization。
  • Step 14/16 ParameterInspector → Validation Block。
  • Step 19 ErrorHandler → Exception Handling Block。

結語

深入理解 Dispatcher Pipeline 的 20 步驟與核心物件關係,是靈活運用 WCF 擴展點、解決企業級應用橫切關注點的基石。建議配合 Reflector 閱讀原始碼,將理論與實作雙向驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved