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

WCF 專題系列(三):深入尋址 Part 3 — 訊息篩選引擎核心機制

     編輯:關於.NET

訊息篩選引擎架構

WCF 接收訊息時,透過訊息篩選引擎決定目標端點。核心兩大組件:

  • 篩選器:MessageFilter 抽象基類,判斷訊息是否匹配條件
  • 篩選器表:IMessageFilterTable<TFilterData>,儲存篩選器鍵值對,支援優先級

每個 EndpointDispatcher 持有兩個篩選器:地址篩選器(檢查 To 標頭與尋址標頭)與契約篩選器(檢查 Action 標頭)。

內建五大篩選器

篩選器用途匹配邏輯
EndpointAddressMessageFilter預設地址篩選器To 標頭與 EndpointAddress 完全匹配,且所有必要尋址標頭存在
ActionMessageFilter預設契約篩選器Action 標頭與操作清單任一匹配;清單空則全匹配
PrefixEndpointAddressMessageFilter前綴地址匹配To 標頭 URI 以篩選器 URI 為前綴(最長前綴匹配)
MatchAllMessageFilter全匹配永遠回傳 true(訊息非 null)
MatchNoneMessageFilter全不匹配永遠回傳 false(訊息非 null)
XPathMessageFilterXPath 1.0 條件依 XPath 運算式評估訊息內容

篩選器繼承體系

篩選器運作示範

var actionFilter1 = new ActionMessageFilter("Add", "Sub");
var actionFilter2 = new ActionMessageFilter("Mul");
var addrFilter1 = new EndpointAddressMessageFilter(new EndpointAddress("https://localhost:8887/Calculator"));
var addrFilter2 = new EndpointAddressMessageFilter(new EndpointAddress("https://www.cnblogs.com/terrylee"));

var msg = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "myBody");
msg.Headers.Action = "Add";
msg.Headers.To = new Uri("https://localhost:8887/Calculator");

Console.WriteLine(actionFilter1.Match(msg)); // True
Console.WriteLine(actionFilter2.Match(msg)); // False
Console.WriteLine(addrFilter1.Match(msg));   // True
Console.WriteLine(addrFilter2.Match(msg));   // False

匹配結果

SOAP 訊息實際內容:

<s:Envelope ...>
  <s:Header>
    <a:To>https://localhost:8887/Calculator</a:To>
    <a:Action>Add</a:Action>
  </s:Header>
  <s:Body></s:Body>
</s:Envelope>

篩選器表內部機制

依篩選器型別分桶存儲,新增時自動分配預設優先級:

篩選器表結構

篩選器條件建構後不可變,需建立新實例替換。

服務層級控制:AddressFilterMode

ServiceBehavior 屬性 AddressFilterMode 三選一:

  • Exact(預設):EndpointAddressMessageFilter
  • Prefix:PrefixEndpointAddressMessageFilter
  • Any:MatchAllMessageFilter
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Prefix)]
public class CalculatorService : ICalculator { ... }

驗證 EndpointDispatcher 實際篩選器

foreach (var cd in host.ChannelDispatchers)
    foreach (var ed in cd.Endpoints)
        Console.WriteLine($"AddrFilter: {ed.AddressFilter} | ContractFilter: {ed.ContractFilter}");

Prefix 模式輸出

總結

訊息篩選引擎是 WCF 訊息分派核心,內建篩選器涵蓋常見需求,AddressFilterMode 提供服務級快速切換,自訂篩選器(下篇主題)則支援任意複雜路由邏輯。

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