WCF 服務端訊息處理管線 (Dispatching Pipeline) 包含從監聽、接收、分派、實例化、執行、序列化、錯誤處理等完整生命週期。本文依管線執行順序,系統梳理八大核心擴展點,說明其介面定義、介入時機與典型應用場景。
角色:決定 Request 如何關聯到 InstanceContext (服務實例包裝器)。
介面:IInstanceContextProvider (GetExistingInstanceContext、InitializeInstanceContext、IsIdle、NotifyIdle)。
內建三種:PerCall、PerSession、Singleton InstanceContextProvider。
應用場景:物件池機制 — 依需求從池取實例、用畢歸還,兼顧 PerCall 無狀態語意與效能。
角色:ChannelDispatcher 依 AddressFilter / ContractFilter 選擇 EndpointDispatcher。
介面:MessageFilter 抽象類別 (Match(Message)、Match(MessageBuffer))。
內建六種:Action、MatchAll、EndpointAddress、MatchNone、PrefixEndpointAddress、XPath。
應用場景:支援 Query String 型 REST 風格路由、自訂 Header 路由邏輯。
角色:攔截 Incoming/Outgoing Message,檢查、修改 Header/Body。
介面:IDispatchMessageInspector (AfterReceiveRequest、BeforeSendReply) / IClientMessageInspector。
應用場景:記錄請求/回應日誌、注入/提取 Context Header (如相關性 ID、驗證 Token)、訊息加解密。
角色:服務實例的建立、釋放、回收。
介面:IInstanceProvider (GetInstance、ReleaseInstance)。
應用場景:DI 容器整合 (Unity、Autofac)、AOP 攔截 (Policy Injection)、單例生命週期自訂管理。
角色:執行緒層級 Context (TLS) 的初始化與清理。
介面:ICallContextInitializer (BeforeInvoke、AfterInvoke)。
應用場景:多語系 Culture 切換、審計資訊注入、工作單元模式初始化。
角色:Message (XML Infoset) 與 CLR 物件陣列雙向轉換。
介面:IDispatchMessageFormatter (DeserializeRequest、SerializeReply) / IClientMessageFormatter。
應用場景:自訂序列化邏輯 (如 Protobuf、自訂二進位格式)、處理非標準訊息結構。
角色:輸入參數驗證 (BeforeCall) 與輸出/回傳值驗證 (AfterCall)。
介面:IParameterInspector (BeforeCall 回傳 correlationState 供 AfterCall 使用)。
應用場景:Enterprise Library Validation Block 整合、參數清洗、回傳值審計。
角色:統一例外處理與錯誤轉換。
介面:IErrorHandler (HandleError 回傳 bool 決定是否繼續處理、ProvideFault 自訂 Fault Message)。
應用場景:Enterprise Library Exception Handling Block 整合、敏感資訊過濾 (Exception Replace)、統一錯誤碼包裝 (Exception Wrap)、記錄完整堆疊。
| 擴展點 | 介面/基類 | 管線階段 | 典型應用 |
|---|---|---|---|
| InstanceContextProvider | IInstanceContextProvider | InstanceContext 取得/建立 | 物件池、自訂 Session 關聯 |
| MessageFilter | MessageFilter | Endpoint 選擇 | Query String 路由、自訂 Header 路由 |
| MessageInspector | IDispatchMessageInspector | 訊息收發前後 | 日誌、Context 傳遞、加解密 |
| InstanceProvider | IInstanceProvider | 實例建立/釋放 | DI 容器、AOP 攔截 |
| CallContextInitializer | ICallContextInitializer | 作業執行前後 | Culture 切換、審計 Context |
| MessageFormatter | IDispatchMessageFormatter | 序列化/反序列化 | 自訂序列化格式 |
| ParameterInspector | IParameterInspector | 參數驗證 | Validation Block、參數清洗 |
| ErrorHandler | IErrorHandler | 例外處理 | Exception Handling Block、錯誤包裝 |
掌握這八大擴展點在 Dispatcher Pipeline 中的位置與職責,即可針對專案需求精準選擇介入點,將橫切關注點 (Logging、Validation、Localization、DI、AOP、Error Handling) 乾淨地從業務邏輯中分離,構建可維護、可擴展的企業級 WCF 服務。