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 擴展主要作用目標)。ServiceDescription (含 Behaviors、Endpoints、ContractDescription、OperationDescription)。AcceptChannel 建立 Channel 接收 Request Message。AddressFilter (預設 EndpointAddressMessageFilter) 比對 Message To Header,優先級最高者勝出 (FilterPriority)。InstanceContextProvider (GetExistingInstanceContext / InitializeInstanceContext) 依 Instancing Mode (PerCall/PerSession/Singleton) 關聯或建立 InstanceContext。DispatchRuntime.OperationSelector.SelectOperation 解析 Action Header,對應 DispatchRuntime.Operations 集合。OperationContext.Current。ManualAddressing=false,依 WS-Addressing 驗證 ReplyTo/FaultTo/From Header。DispatchRuntime.MessageInspectors 呼叫 AfterReceiveRequest。DispatchOperation.ReleaseInstanceBeforeCall=true,呼叫 InstanceProvider.ReleaseInstance。InstanceProvider.GetInstance。DispatchOperation.CallContextInitializers 呼叫 BeforeInvoke。DeserializeRequest=true,透過 DispatchOperation.Formatter.DeserializeRequest 產生參數陣列。ParameterInspectors 呼叫 BeforeCall (回傳 correlationState)。IOperationInvoker.Invoke (同步) 或 InvokeBegin/End (非同步) 呼叫實際方法。ParameterInspectors 呼叫 AfterCall (傳入 correlationState)。SerializeReply=true,透過 Formatter.SerializeReply 產生 Reply Message。CallContextInitializers 呼叫 AfterInvoke。MessageInspectors 呼叫 BeforeSendReply。ChannelDispatcher.ErrorHandlers,HandleError 回傳 true 則停止;ProvideFault 產生自訂 Fault Message。Behaviors:KeyedByTypeCollection<IServiceBehavior>,含 ServiceBehaviorAttribute 及自訂 Service Behavior。Endpoints:ServiceEndpointCollection,每個 Endpoint 含 ABC + Behaviors + ListenUri/Mode。ContractDescription:含 ContractType、Operations、SessionMode、Behaviors (ContractBehavior)。EndpointDispatcher.AddressFilter = EndpointAddressMessageFilter (比對 To Header);ContractFilter = MatchAllMessageFilter。若多 Endpoint 符合,依 FilterPriority 決定。
PerCall:GetExistingInstanceContext 永回 null,IsIdle 回 true。PerSession:Session 已建立回既有 Context,否則 null;IsIdle 回 false。Singleton:實例建立後後續請求回同一 Context;IsIdle 回 false。自訂時建議繼承 InstanceContextProviderBase 而非直接實作介面。
預設 System.ServiceModel.Channels.OperationSelector 回傳 Action Header 值,對應 DispatchOperation 名稱。
本系列後續文章即針對上述管線關鍵步驟實作擴展:
InstanceProvider → Unity 整合、Policy Injection、物件池。MessageInspector → Context 傳遞。CallContextInitializer → Localization。ParameterInspector → Validation Block。ErrorHandler → Exception Handling Block。深入理解 Dispatcher Pipeline 的 20 步驟與核心物件關係,是靈活運用 WCF 擴展點、解決企業級應用橫切關注點的基石。建議配合 Reflector 閱讀原始碼,將理論與實作雙向驗證。