ChannelFactory<T> 建立涉及反射、配置讀取、通道堆疊構建等昂貴操作。.NET 3.5 引入 ClientBase<T> 靜態緩存機制,讓相同配置的代理共用同一個 Factory,大幅提升效能。但許多開發者因不了解規則導致緩存失效。本文深入解析緩存鍵值、失效場景與最佳實踐。
靜態字典鍵值由建構函式參數衍生:
InstanceContext 封裝的回呼物件(雙工服務用)。"*")。EndpointAddress 遠端位址(預設 null)。相同建構函式多載 + 相同參數 = 共用 Factory。
var p1 = new CalculatorClient("configName"); p1.Open();
var p2 = new CalculatorClient("configName"); p2.Open();
Console.WriteLine(ReferenceEquals(p1.ChannelFactory, p2.ChannelFactory)); // True
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
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
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
ChannelFactory、Endpoint、ClientCredentials 三個屬性。需要自訂憑證等設定時,應在 Open 後透過 proxy.ChannelFactory.Credentials 設定,或繼承 ClientBase<T> 覆寫 CreateChannel。理解緩存機制,統一建構函式用法、延後屬性訪問,能讓 WCF 客戶端在高頻調用場景下獲得顯著效能提升。