Visual Studio 內建的 WCF 專案範本過於簡單,無法滿足企業級開發對**關注點分離、團隊協作、測試驅動、多環境部署**的需求。本文提出一個經實戰驗證的 **WCF 解決方案標準化模板**,將專案拆分為 6 個核心組件,配置多啟動專案實現一鍵調試,並內建三種主流綁定配置範本。
| 專案名稱 | 類型 | 職責 | 關鍵輸出 |
|---|---|---|---|
| Wcf.Contracts | Class Library | **純契約定義**:服務契約介面、資料契約、錯誤契約、訊息契約。無任何實作依賴。 | Contracts.dll (共用組件) |
| Wcf.ServiceLib | Class Library | **服務實作邏輯**:引用 Contracts,實作服務介面。包含商業規則、資料存取、外部呼叫。 | ServiceLib.dll |
| Wcf.Host | Console Application | **主控台宿主**:開發/測試/生產 (非 HTTP) 首選。支援 NetTcp/BasicHttp/WSDualHttp 三種綁定同時啟用。 | Host.exe |
| Wcf.WebServiceHost | Web Application | **IIS/WAS 宿主**:.svc 檔案 + web.config。生產環境 HTTP/HTTPS 部署標準。 | Web 部署套件 |
| Wcf.Proxys | Class Library | **客戶端代理 (可選)**:ChannelFactory 包裝、自訂代理基類、快取邏輯。或共用 Contracts 直接用 ChannelFactory。 | Proxys.dll |
| Wcf.Client | Console / WPF / WinForms | **測試/示範客戶端**:引用 Contracts (+ Proxys),驗證服務功能。 | Client.exe |
static void Main(string[] args)
{
var baseTcp = new Uri("net.tcp://localhost:8080/MyService");
var baseHttp = new Uri("https://localhost:8081/MyService");
var baseDual = new Uri("https://localhost:8082/MyService");
using (var host = new ServiceHost(typeof(MyServiceImpl), baseTcp, baseHttp, baseDual))
{
// 1. 區域網高效能:NetTcpBinding
host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(), "tcp");
// 2. 跨防火牆/非 .NET 客戶端:BasicHttpBinding (SOAP 1.1)
host.AddServiceEndpoint(typeof(IMyService), new BasicHttpBinding(), "http");
// 3. 雙工回調支援:WSDualHttpBinding
var dualBinding = new WSDualHttpBinding();
host.AddServiceEndpoint(typeof(IMyService), dualBinding, "dual");
// MEX 端點 (各基址自動對應)
var smb = host.Description.Behaviors.Find();
if (smb == null) smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Service running. Press Enter to exit...");
Console.ReadLine();
}
}
優勢:無需手動啟動宿主、無需部署 IIS、即時修改服務邏輯即時生效 (重啟 Client 即可)。
| 綁定 | 傳輸 | 編碼 | 安全性 | 雙工 | 適用場景 |
|---|---|---|---|---|---|
| NetTcpBinding | TCP | Binary | Transport/Message | 否 | 內網 .NET 對 .NET、高效能、低延遲 |
| BasicHttpBinding | HTTP/HTTPS | Text (SOAP 1.1) | Transport/Message | 否 | 跨平台、穿透防火牆、舊 ASMX 客戶端、Silverlight |
| WSDualHttpBinding | HTTP | Text (SOAP 1.2) | Message | 是 | 伺服器推播、事件通知、長時間作業進度回報 |
ChannelFactory<T> 快取池,提供 `UsingProxy標準化解決方案模板不是形式主義,而是**將架構決策固化為專案結構**,讓團隊新成員「開箱即用」正確實踐:契約隔離、宿主無關、組態驅動、多端點共存、一鍵調試。這份模板陪伴作者多個企業級專案穩健交付,推薦作為您 WCF 專案的起始基準線。