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

WCF 專題系列(四):深入尋址 Part 4 — 自訂訊息篩選器與 EndpointBehavior 整合

     編輯:關於.NET

自訂訊息篩選器動機

預設 EndpointAddressMessageFilter 要求 To 標頭完全匹配。業務需求:僅檢查 To 標頭是否包含特定字串(如 "terrylee")即路由至端點。

實作自訂篩選器

繼承 MessageFilter 覆寫 Match:

public class SpecialCharactersMessageFilter : MessageFilter
{
    private readonly string _characters;
    public SpecialCharactersMessageFilter(string characters) => _characters = characters;

    public override bool Match(Message message)
    {
        var to = message.Headers.To;
        return to != null && to.AbsoluteUri.Contains(_characters);
    }
    public override bool Match(MessageBuffer buffer) => Match(buffer.CreateMessage());
}

EndpointBehavior 整合替換預設篩選器

public class FilteringEndpointBehavior : IEndpointBehavior
{
    private readonly MessageFilter _addressFilter, _contractFilter;
    public FilteringEndpointBehavior(MessageFilter addressFilter, MessageFilter contractFilter)
    { _addressFilter = addressFilter; _contractFilter = contractFilter; }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher dispatcher)
    {
        dispatcher.AddressFilter = _addressFilter;
        dispatcher.ContractFilter = _contractFilter;
    }
    // 其他介面方法空實作...
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        => throw new InvalidOperationException("僅限服務端使用");
}

BehaviorExtensionElement 組態化

public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement
{
    [ConfigurationProperty("characters", DefaultValue = "terrylee", IsRequired = true)]
    public string Characters => (string)base["characters"];

    protected override object CreateBehavior()
    {
        return new FilteringEndpointBehavior(
            new SpecialCharactersMessageFilter(Characters),
            new MatchAllMessageFilter()); // 合約篩選器全通
    }
    public override Type BehaviorType => typeof(FilteringEndpointBehavior);
}

服務與組態完整範例

服務契約

[ServiceContract(Namespace = "https://www.cnblogs.com/terrylee/")]
public interface IEchoService { [OperationContract] string Echo(string msg); }

public class EchoService : IEchoService { public string Echo(string msg) => "Hello:" + msg; }

組態檔

<system.serviceModel>
  <services>
    <service name="...EchoService" behaviorConfiguration="echoBehavior">
      <endpoint address="" binding="wsHttpBinding" contract="...IEchoService"
                behaviorConfiguration="filterBehavior" />
    </service>
  </services>
  <extensions>
    <behaviorExtensions>
      <add name="filteringEndpointBehavior"
           type="...FilteringEndpointBehaviorExtension, Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </behaviorExtensions>
  </extensions>
  <behaviors>
    <endpointBehaviors>
      <behavior name="filterBehavior">
        <filteringEndpointBehavior characters="terrylee" />
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>

驗證測試

啟動服務,主控台輸出確認篩選器已替換:

篩選器替換確認

客戶端測試代碼

var factory = new ChannelFactory<IEchoService>(new WSHttpBinding(),
    new EndpointAddress("https://localhost/terrylee")); // 含 terrylee
var channel = factory.CreateChannel(new EndpointAddress("https://localhost/terrylee"),
    new Uri("https://localhost:8887/EchoService")); // Via 實體位址
Console.WriteLine(channel.Echo("cnblogs")); // 成功

測試成功

修改位址不含關鍵字

new EndpointAddress("https://localhost/anytao") // 無 terrylee

回傳錯誤:

測試失敗

總結

自訂 MessageFilter + IEndpointBehavior + BehaviorExtensionElement 三步驟,靈活控制訊息路由邏輯,脫離預設完全匹配限制,構建豐富中介路由場景。

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