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

WCF 技術深度剖析(八):ClientBase<T> 的 ChannelFactory 緩存機制與最佳實踐

     編輯:關於.NET

前言:ChannelFactory 建立成本高,緩存至關重要

ChannelFactory<T> 建立涉及反射、配置讀取、通道堆疊構建等昂貴操作。.NET 3.5 引入 ClientBase<T> 靜態緩存機制,讓相同配置的代理共用同一個 Factory,大幅提升效能。但許多開發者因不了解規則導致緩存失效。本文深入解析緩存鍵值、失效場景與最佳實踐。

一、緩存鍵值:三要素決定唯一性

靜態字典鍵值由建構函式參數衍生:

  1. CallbackInstance:InstanceContext 封裝的回呼物件(雙工服務用)。
  2. EndpointConfigurationName:配置檔端點名稱(預設 "*")。
  3. RemoteAddress:EndpointAddress 遠端位址(預設 null)。

相同建構函式多載 + 相同參數 = 共用 Factory。

二、實驗驗證緩存行為

1. 相同建構函式 → 共用(True)

var p1 = new CalculatorClient("configName"); p1.Open();
var p2 = new CalculatorClient("configName"); p2.Open();
Console.WriteLine(ReferenceEquals(p1.ChannelFactory, p2.ChannelFactory)); // True

2. 不同建構函式多載 → 不共用(False)

var p1 = new CalculatorClient("configName", new EndpointAddress("https://...")); p1.Open();
var p2 = new CalculatorClient("configName"); p2.Open(); // 實際位址相同,但多載不同
Console.WriteLine(ReferenceEquals(p1.ChannelFactory, p2.ChannelFactory)); // False

3. 傳入 Binding 物件 → 不緩存(False)

var b = new BasicHttpBinding();
var p1 = new CalculatorClient(b, address); p1.Open();
var p2 = new CalculatorClient(b, address); p2.Open();
Console.WriteLine(ReferenceEquals(p1.ChannelFactory, p2.ChannelFactory)); // False

4. Open 前讀取 ChannelFactory/Endpoint/ClientCredentials → 破壞緩存(False)

var p1 = new CalculatorClient("configName");
var _ = p1.ChannelFactory; // 僅讀取屬性
p1.Open();
var p2 = new CalculatorClient("configName"); p2.Open();
Console.WriteLine(ReferenceEquals(p1.ChannelFactory, p2.ChannelFactory)); // False

三、兩大最佳實踐

  1. 避免在程式碼中手動指定 Binding,改用配置檔聲明,讓框架自動匹配緩存鍵值。
  2. 建立代理後立即呼叫 Open(),不要在 Open 前訪問 ChannelFactory、Endpoint、ClientCredentials 三個屬性。需要自訂憑證等設定時,應在 Open 後透過 proxy.ChannelFactory.Credentials 設定,或繼承 ClientBase<T> 覆寫 CreateChannel。

總結

理解緩存機制,統一建構函式用法、延後屬性訪問,能讓 WCF 客戶端在高頻調用場景下獲得顯著效能提升。

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