需求變更是軟體開發的常態。WCF 以其**組態驅動、契約優先、宿主無關**的架構特性,展現了極強的適應變化能力。本文透過一個真實演進故事——從區域網單一服務,到跨網域部署、Windows Service 宿主遷移、資料契約非破壞性版本升級、高併發節流配置——完整示範 WCF 如何優雅應對各類變更。
// 宿主 (Console)
var host = new ServiceHost(typeof(Service));
var binding = new NetTcpBinding();
host.AddServiceEndpoint(typeof(IService), binding, "net.tcp://127.0.0.1:6547/Service");
host.Open();
// 客戶端
var proxy = new ServiceClient(new NetTcpBinding(),
new EndpointAddress("net.tcp://127.0.0.1:6547/Service"));
特點:高效能二進位協定、單機/區域網、Console 宿主需手動啟動。
新辦事處位於不同網域,TCP 連線不通;需支援 HTTP 穿透防火牆。
// 宿主新增:不動原有 TCP 端點
var httpBinding = new BasicHttpBinding();
host.AddServiceEndpoint(typeof(IService), httpBinding, "https://202.120.120.3:80/Service");
// 唐山辦事處客戶端改用 HTTP
var proxy = new ServiceClient(new BasicHttpBinding(),
new EndpointAddress("https://202.120.120.3:80/Service"));
結果:原有總部 TCP 客戶端**零影響**繼續運行;新辦事處 HTTP 客戶端順利接入。**綁定/位址/協定變更完全隔離於商業邏輯**。
Console 宿主需人工啟動,停電後服務中斷。
| 宿主類型 | 支援協定 | 自動啟動 | 管理工具 |
|---|---|---|---|
| Console App | 全部 | 否 | 手動 |
| IIS / WAS | 僅 HTTP/HTTPS | 是 | IIS 管理員 |
| Windows Service | 全部 (TCP/HTTP/Pipe/MSMQ) | 是 (自動/延遲啟動) | 服務控制管理器 (SCM) |
將 Console 宿主的 ServiceHost 程式碼移至 OnStart(),OnStop() 呼叫 host.Close()。安裝為 Windows Service (installutil / sc create)。
核心洞見:ServiceHost 使用方式**在所有宿主中完全一致**,遷移成本極低。
現有 10+ 客戶端穩定運行,大客戶強制要求 `Order` 新增 `CreateTime`,修改契約將導致舊客戶端反序列化失敗。
[DataContract]
public class Order : IExtensibleDataObject // 關鍵介面
{
[DataMember] public string OrderID { get; set; }
[DataMember] public string Content { get; set; }
// 新欄位:僅新增 DataMember,不修改既有成員
[DataMember] public DateTime CreateTime { get; set; }
// 保留未知資料 (向前相容)
public ExtensionDataObject ExtensionData { get; set; }
}
IsRequired=false)DataMember(Name="oldName"))IsRequired 從 true 改為 falseIExtensibleDataObjectEnumMember(Value="old"))maxConcurrentCalls = 16:同時處理請求數maxConcurrentSessions = 10:PerSession 實例上限maxConcurrentInstances = Int32.MaxValue:總實例上限
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceThrottling
maxConcurrentCalls="100"
maxConcurrentSessions="50"
maxConcurrentInstances="200" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
根據硬體資源 (CPU 核心、記憶體、資料庫連線池) 壓測調整,避免排隊逾時。
| 變化維度 | WCF 機制 | 核心優勢 |
|---|---|---|
| 傳輸/協定/位址 | 多端點、組態驅動 | **零代碼修改** 新增支援,舊客戶端不受影響 |
| 宿主進程/生命週期 | ServiceHost 統一抽象 | **遷移成本極低**,Console→WinService→IIS 無縫切換 |
| 資料契約演進 | IExtensibleDataObject、選擇性成員、Name 映射 | **向前/向後相容**,非破壞性升級,無需全量重部署 |
| 效能/併發擴展 | serviceThrottling 行為配置 | **宣告式調優**,無需重寫代碼即可應對流量增長 |
「擁抱變化」不只是口號,WCF 以**契約優先、組態驅動、邊界清晰**的架構哲學,將變更影響範圍最小化。從綁定切換到宿主遷移,從契約版本演進到節流優化,每一個變更故事都證明:**良好的架構,是應對不確定性的最佳保險**。停止製造垃圾代碼,開始投資於契約設計、組態管理與版本策略,才是通往高品質分散式系統的正道。