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

WCF 擴展框架深度解析:行為擴展完全指南

     編輯:關於.NET

WCF 強大的擴展架構讓開發者能在訊息處理管線的關鍵節點注入自定義邏輯。行為擴展 是最常用的擴展點,本文系統梳理四大行為類型、核心攔截介面、配置與屬性註冊方式,並提供實戰代碼範例。

核心攔截介面

定義於 System.ServiceModel.Dispatcher 命名空間,分為參數檢查、訊息檢查、操作調用器三類:

介面作用端核心方法用途
IParameterInspector服務端/客戶端BeforeCall/AfterCall方法參數驗證、日誌、返回值處理
IDispatchMessageInspector服務端AfterReceiveRequest/BeforeSendReply服務端訊息攔截(請求/回覆)
IClientMessageInspector客戶端BeforeSendRequest/AfterReceiveReply客戶端訊息攔截(請求/回覆)
IOperationInvoker服務端Invoke 等自定義操作調用邏輯(如異步包裝、事務)

注意: IDispatchMessageInspector 與 IClientMessageInspector 方法順序相反,前者先 AfterReceiveRequest 後 BeforeSendReply,後者先 BeforeSendRequest 後 AfterReceiveReply。

四大行為類型與介面

行為類型介面作用範圍適用方法
服務行為IServiceBehavior整個服務 (ServiceHost)AddBindingParameters, ApplyDispatchBehavior
端點行為IEndpointBehavior特定端點AddBindingParameters, ApplyClientBehavior, ApplyDispatchBehavior
契約行為IContractBehavior特定契約AddBindingParameters, ApplyClientBehavior, ApplyDispatchBehavior
操作行為IOperationBehavior特定操作AddBindingParameters, ApplyClientBehavior, ApplyDispatchBehavior, Validate

註冊方式對照表

行為類型屬性註冊配置檔註冊ServiceDescription 程式化註冊
服務行為✓✓✓
端點行為✗✓✓
契約行為✓✗✓
操作行為✓✗✓

實戰範例:參數驗證攔截器

1. 實現 IParameterInspector

public class CalculatorParameterInspector : IParameterInspector {
    public object BeforeCall(string operationName, object[] inputs) {
        int x = (int)inputs[0];
        int y = (int)inputs[1];
        if (x < 0 || y < 0)
            throw new FaultException("參數不能為負數");
        return null; // correlationState
    }
    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState) { }
}

2. 封裝為操作行為 (IOperationBehavior)

public class CalculatorParameterValidation : Attribute, IOperationBehavior {
    public void ApplyClientBehavior(OperationDescription od, ClientOperation co) {
        co.ParameterInspectors.Add(new CalculatorParameterInspector());
    }
    public void ApplyDispatchBehavior(OperationDescription od, DispatchOperation dop) {
        dop.ParameterInspectors.Add(new CalculatorParameterInspector());
    }
    // AddBindingParameters, Validate 留空
}

3. 合併實現(更優雅)

public class CalculatorParameterValidation : Attribute, IParameterInspector, IOperationBehavior {
    // IParameterInspector 實現...
    // IOperationBehavior 實現中直接 Add(this) 而非 new Inspector()
}

訊息攔截器註冊詳解

端點行為註冊雙向攔截

public class PrintMessageInspectorBehavior : IDispatchMessageInspector, IEndpointBehavior {
    // IDispatchMessageInspector 實現略...

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
        clientRuntime.MessageInspectors.Add(this);
    }
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(this);
    }
}

服務行為註冊(需遍歷 ChannelDispatcher)

public void ApplyDispatchBehavior(ServiceDescription sd, ServiceHostBase shb) {
    foreach (ChannelDispatcher cd in shb.ChannelDispatchers) {
        foreach (EndpointDispatcher ed in cd.Endpoints) {
            ed.DispatchRuntime.MessageInspectors.Add(this);
        }
    }
}

配置檔擴展元素開發

1. 繼承 BehaviorExtensionElement

public class MyBehaviorExtensionElement : BehaviorExtensionElement {
    public override Type BehaviorType => typeof(MyServiceBehavior);
    protected override object CreateBehavior() => new MyServiceBehavior();
    
    // 自定義屬性
    [ConfigurationProperty("providerName", IsRequired = true)]
    public string ProviderName {
        get => (string)this["providerName"];
        set => this["providerName"] = value;
    }
}

2. 配置檔註冊 (關鍵細節)

<system.serviceModel>
  <extensions>
    <behaviorExtensions>
      <add name="myBehavior" 
           type="MyNamespace.MyBehaviorExtensionElement, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </behaviorExtensions>
  </extensions>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <myBehavior providerName="MyProvider" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

避坑指南: type 屬性必須包含完整類型名、組件名、版本、文化、公鑰 token,**每個逗號後必須有一空格**,否則反射載入失敗。

操作調用器擴展

通過 IOperationBehavior.ApplyDispatchBehavior 設定 DispatchOperation.Invoker:

public class MyOperationInvokerBehavior : Attribute, IOperationBehavior {
    public void ApplyDispatchBehavior(OperationDescription od, DispatchOperation dop) {
        dop.Invoker = new MyOperationInvoker(dop.Invoker); // 裝飾模式包裝原調用器
    }
}

最佳實踐總結

  1. 職責分離:攔截器邏輯獨立於行為類,或合併實現介面減少物件創建。
  2. 選擇正確作用域:全域用服務行為,端點級用端點行為,操作級用操作行為。
  3. 配置優先:生產環境建議用配置檔註冊,便於無需重編譯即可啟用/停用擴展。
  4. 異常處理:攔截器中捕獲異常轉為 FaultException,避免通道錯誤導致連線中斷。

掌握行為擴展,即掌握了 WCF 管線的「神經中樞」,能優雅實現日誌、驗證、效能監控、安全審計等橫切關注點。

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