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

WCF 深度之旅(16):訊息分發核心——ChannelDispatcher、EndpointDispatcher 與 MessageFilter 篩選機制

     編輯:關於.NET

WCF 服務啟動後,訊息如何從網路抵達具體服務實例方法?本文揭示 ServiceHost、ChannelDispatcher、ChannelListener、EndpointDispatcher 協作流程,及雙重 MessageFilter(AddressFilter + ContractFilter) 篩選機制。

服務啟動與監聽器建立

配置範例:同一服務 3 個端點,前 2 個共用 listenUri=6666,第 3 個預設 listenUri=7777。

<service name="CalculateService">
  <endpoint address="https://127.0.0.1:9999/calculateservice" listenUri="https://127.0.0.1:6666/calculateservice" />
  <endpoint address="https://127.0.0.1:8888/calculateservice" listenUri="https://127.0.0.1:6666/calculateservice" />
  <endpoint address="https://127.0.0.1:7777/calculateservice" />
</service>

ServiceHost.Open() 執行時:

  1. 依**實際監聽地址**建立 ChannelDispatcher(本例 2 個:6666、7777)。
  2. 每個 ChannelDispatcher 擁有唯一 ChannelListener,綁定 URI 監聽連線。
  3. 每個端點建立 EndpointDispatcher,歸屬對應 ChannelDispatcher(按監聽地址匹配)。

驗證代碼輸出:

ChannelDispatcher 1: ListenUri: https://127.0.0.1:6666/calculateservice
  EndpointDispatcher 1: EndpointAddress: https://127.0.0.1:9999/calculateservice
  EndpointDispatcher 2: EndpointDispatcher 2: EndpointAddress: https://127.0.0.1:8888/calculateservice
ChannelDispatcher 2: ListenUri: https://127.0.0.1:7777/calculateservice
  EndpointDispatcher 1: EndpointAddress: https://127.0.0.1:7777/calculateservice

訊息分發流程

網路請求 
  → ChannelListener.AcceptChannel() 建立輸入通道堆疊接收訊息
  → ChannelDispatcher 接收訊息
  → 遍歷其 EndpointDispatcher 集合
     → 呼叫 AddressFilter.Match(msg) AND ContractFilter.Match(msg)
     → 雙雙 true → 該 EndpointDispatcher 處理後續(實例化、調度、調用)

MessageFilter 類型與預設行為

Filter匹配邏輯預設用途
EndpointAddressMessageFilter SOAP To 標頭 == 端點 Address AddressFilter (預設)
PrefixEndpointAddressMessageFilter SOAP To 標頭以端點 Address 為前綴 AddressFilter (Prefix 模式)
ActionMessageFilter SOAP Action 標頭在端點合約操作清單中 ContractFilter (預設)
XPathMessageFilter 自訂 XPath 匹配 SOAP 內容 擴展
MatchAllMessageFilter 永遠 true AddressFilter (Any 模式)
MatchNoneMessageFilter 永遠 false 測試/攔截

自訂 AddressFilterMode

透過 [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)] 覆蓋預設精確匹配:

  • Exact(預設):EndpointAddressMessageFilter
  • Prefix:PrefixEndpointAddressMessageFilter
  • Any:MatchAllMessageFilter(忽略 To 標頭,攔截所有訊息)

應用場景:路由器、訊息攔截器、負載平衡器需設 Any 接收任意目標訊息。

自訂 Filter 進階

實作 IEndpointBehavior,在 ApplyDispatchBehavior 中替換 EndpointDispatcher.AddressFilter/ContractFilter:

public class CustomFilterBehavior : IEndpointBehavior {
  public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher dispatcher) {
    dispatcher.AddressFilter = new MyCustomFilter();
    dispatcher.ContractFilter = new ActionMessageFilter(new[] { "CustomAction" });
  }
}

關鍵洞見

  1. ChannelDispatcher 按監聽地址分組,非按端點配置數量。
  2. 雙重篩選確保訊息精準路由:地址 + 合約動作。
  3. 預設精確匹配符合大多數場景,路由/攔截需顯式設 Any。
  4. Filter 可擴展支援基於內容路由(XPath、自訂邏輯)。

理解分發管線,是實作 WCF 路由、攔截、多租戶隔離的基石。

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