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

WCF 實戰系列 (14):標準化 WCF 解決方案架構模板——契約、實作、宿主、代理、客戶端五層分離與多啟動調試實踐

     編輯:關於.NET

前言

Visual Studio 內建的 WCF 專案範本過於簡單,無法滿足企業級開發對**關注點分離、團隊協作、測試驅動、多環境部署**的需求。本文提出一個經實戰驗證的 **WCF 解決方案標準化模板**,將專案拆分為 6 個核心組件,配置多啟動專案實現一鍵調試,並內建三種主流綁定配置範本。

一、 解決方案結構總覽

專案名稱類型職責關鍵輸出
Wcf.ContractsClass Library**純契約定義**:服務契約介面、資料契約、錯誤契約、訊息契約。無任何實作依賴。Contracts.dll (共用組件)
Wcf.ServiceLibClass Library**服務實作邏輯**:引用 Contracts,實作服務介面。包含商業規則、資料存取、外部呼叫。ServiceLib.dll
Wcf.HostConsole Application**主控台宿主**:開發/測試/生產 (非 HTTP) 首選。支援 NetTcp/BasicHttp/WSDualHttp 三種綁定同時啟用。Host.exe
Wcf.WebServiceHostWeb Application**IIS/WAS 宿主**:.svc 檔案 + web.config。生產環境 HTTP/HTTPS 部署標準。Web 部署套件
Wcf.ProxysClass Library**客戶端代理 (可選)**:ChannelFactory 包裝、自訂代理基類、快取邏輯。或共用 Contracts 直接用 ChannelFactory。Proxys.dll
Wcf.ClientConsole / WPF / WinForms**測試/示範客戶端**:引用 Contracts (+ Proxys),驗證服務功能。Client.exe

二、 核心設計原則

  1. 契約優先:Contracts 為核心,ServiceLib/Host/Client/Proxys 僅**引用** Contracts,**不相互引用**
  2. 介面隔離:Contracts 僅含介面/DTO,無具體類別、無資料庫實體、無第三方依賴
  3. 共用組件部署:Contracts.dll 部署至服務端與客戶端,實現**組件級共用**,避免 svcutil 產生代理的版本偏移
  4. 宿主無關性:ServiceLib 純邏輯,無宿主依賴,可輕鬆切換 Console/IIS/Windows Service/Self-Host

三、 Wcf.Host 多綁定同時啟用配置


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();
    }
}

四、 多啟動專案配置:一鍵調試全鏈路

  1. 方案總管右鍵方案 → Properties → Common Properties → Startup Project
  2. 選擇 **Multiple startup projects**
  3. 設定 Wcf.Host = Start、Wcf.Client = Start (其餘 None)
  4. 按 F5:宿主啟動 → 客戶端自動連接 → 斷點雙邊命中

優勢:無需手動啟動宿主、無需部署 IIS、即時修改服務邏輯即時生效 (重啟 Client 即可)。

五、 三種綁定適用場景速查

綁定傳輸編碼安全性雙工適用場景
NetTcpBindingTCPBinaryTransport/Message否內網 .NET 對 .NET、高效能、低延遲
BasicHttpBindingHTTP/HTTPSText (SOAP 1.1)Transport/Message否跨平台、穿透防火牆、舊 ASMX 客戶端、Silverlight
WSDualHttpBindingHTTPText (SOAP 1.2)Message是伺服器推播、事件通知、長時間作業進度回報

六、 進階擴展建議

  • Wcf.Host 改為 Windows Service 專案 (生產非 HTTP 部署標準)
  • Wcf.Proxys 實作 ChannelFactory<T> 快取池,提供 `UsingProxy(Action)` 輔助方法,自動處理生命週期與錯誤狀態
  • Wcf.Contracts 獨立 NuGet 套件發布,服務端/客戶端透過套件管理版本
  • 引入 **xUnit + Moq** 測試專案,針對 ServiceLib 進行單元測試 (無需宿主)
  • CI/CD 管線:Build → Test → Pack Contracts NuGet → Deploy Host/WebHost → Integration Test

結語

標準化解決方案模板不是形式主義,而是**將架構決策固化為專案結構**,讓團隊新成員「開箱即用」正確實踐:契約隔離、宿主無關、組態驅動、多端點共存、一鍵調試。這份模板陪伴作者多個企業級專案穩健交付,推薦作為您 WCF 專案的起始基準線。

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