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

WCF 服務承載與消費全方位指南:從自承載到 IIS/WAS 企業級部署

     編輯:關於.NET

核心觀點

企業級 SOA 成敗關鍵在於服務承載策略。WCF 無內建宿主,提供 ServiceHost 類讓開發者在自有應用程式中承載服務。只需配置端點並調用 Open(),無需關心網絡傳輸細節。ServiceHostBase 整合了綁定、通道、調度器、偵聽器等核心功能,大幅降低宿主應用複雜度。

三大主流承載方案對比

方案優點缺點適用場景
自承載
(Console/WinForms/WPF)
幾行代碼啟動;生命週期靈活控制;易除錯;xcopy 部署;支援所有綁定/傳輸僅應用程式運行時可用;缺乏高可用性、管理、版本控制、自動回收等企業級特性開發/測試/原型;桌面進程間通訊;P2P 場景
Windows Service自動啟動;失敗自動恢復;自定義安全身份;運維人員熟悉 SCM 管理;支援所有綁定需 Installutil/安裝包部署;企業級特性仍需自行實作伺服器長期運行服務;需自動啟動與恢復的場景
IIS/WAS 承載進程回收/資源限制/日誌/健康監控內建;WAS 支援非 HTTP 協議;企業級功能最完整配置相對複雜;IIS 5.1/6.0 僅限 HTTP生產環境關鍵業務服務;高可用性要求;跨協議需求

.NET 應用程式域與承載環境

  • CLR 在進程中創建應用程式域隔離託管代碼
  • 單進程可容納多應用程式域,相互獨立
  • 每個應用程式域可承載零或多個 ServiceHost 實例(建議一個)
  • IIS 提供進程模型:應用程式池 = w3wp.exe 工作進程,按需啟動

進程、應用程式域與 ServiceHost 關係

自承載實作範例:WinForms 報價追蹤服務

[ServiceContract]
interface ITradeTrackingService
{
    [OperationContract]
    void PublishQuote(Quote quote);
}

// WinForms 應用中
ServiceHost host = new ServiceHost(typeof(TradeTrackingService));
host.Open();

Windows Service 承載 WCF 服務

public partial class ExchangeWindowsService : ServiceBase
{
    ServiceHost host;
    protected override void OnStart(string[] args)
    {
        host = new ServiceHost(typeof(TradeService));
        host.Open();
    }
    protected override void OnStop()
    {
        if (host != null) host.Close();
    }
}

安裝部署步驟

  1. 服務設計器 → 右鍵「添加安裝程式」
  2. 設定 ServiceInstaller:ServiceName、StartType=Automatic
  3. 設定 ServiceProcessInstaller:Account=NetworkService
  4. 添加「安裝項目」輸出專案主輸出
  5. 配置自定義動作(Install/Commit/Rollback/Uninstall)
  6. 建置產出 .msi 安裝包

添加安裝程式

服務屬性設定

進程安裝程式設定

安裝項目模板

添加專案輸出

自定義動作視圖

IIS 承載 WCF 服務深度解析

.svc 檔案機制

副檔名 .svc,關聯服務實現,IIS 自動創建 ServiceHost。支援內嵌代碼、App_Code、Bin 組件、GAC 組件四種代碼部署方式。

<%@ ServiceHost Language="C#" 
    Service="QuickReturns.StockTrading.ExchangeService.TradeService"
    CodeBehind="~/App_Code/TradeService.cs" %>

Web.config 端點配置

<system.serviceModel>
  <services>
    <service name="..." behaviorConfiguration="tradeServiceBehavior">
      <endpoint address="" binding="basicHttpBinding" contract="...ITradeService"/>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="tradeServiceBehavior">
        <serviceMetadata httpGetEnabled="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

進階:自定義 ServiceHostFactory

繼承 ServiceHostFactory 覆寫 CreateServiceHost,在 .svc 指定 Factory 屬性,獲取 ServiceHost 實例化控制權。

public class TradeServiceCustomHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return new TradeServiceCustomHost(serviceType, baseAddresses);
    }
}

public class TradeServiceCustomHost : ServiceHost
{
    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();
        // 自定義配置邏輯
    }
}

應用程式回收機制

  • IIS 管理控制台配置回收規則:記憶體/時間/請求數閾值
  • 關鍵檔案變更觸發應用程式域回收
  • hostingEnvironment idleTimeout/shutdownTimeout 控制閒置與關閉等待時間
  • 會話狀態預設記憶體內,回收導致遺失 → 需 ASP.NET 相容模式啟用 SQL Server/State Server 持久化

應用程式池回收設定

ASP.NET 相容模式

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class TradeService : ITradeService { ... }

// Web.config
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
模式說明
NotAllowed絕不在 ASP.NET 相容模式運行(非 HTTP 服務)
Allowed可選擇性運行
Required必須運行(需持久會話),驗證所有端點為 HTTP

IIS 版本演進與架構差異

IIS 5.1 (XP) / 6.0 (Server 2003)

  • IIS 5.1:單站點,aspnet_wp.exe 工作進程
  • IIS 6.0:應用程式池架構,w3wp.exe 工作進程,HTTP.SYS 核心模式堆疊
  • 兩者僅支援 HTTP 協議

IIS 6.0 核心架構

IIS 5.1 進程模型

IIS 6.0 承載架構

IIS 7.0 + WAS (Vista/Server 2008)

  • 協議無關的啟用架構:HTTP/TCP/Pipe/MSMQ 四大傳輸全支援
  • WAS (Windows Process Activation Service) 接管進程創建與配置
  • 偵聽器適配器註冊 WAS,接收請求→喚醒工作進程→交由應用程式域協議處理器
  • EnsureServiceAvailable 靜態方法啟動 ServiceHost(含所有端點)

IIS 7.0 進程模型

WAS 啟用工作進程流程

WCF 服務消費:代理生成三大途徑

  1. 手工構建:從 WSDL 生成代理,適用無 WCF 客戶端
  2. Visual Studio「添加服務引用」:封裝 SvcUtil.exe,自動生成代理類、配置檔、添加參考
  3. SvcUtil.exe 命令列:完全控制生成參數

VS「添加服務引用」流程

添加服務引用選單

添加服務引用對話框

SvcUtil.exe 命令範例

svcutil /config:app.config /out:"ExchangeService.cs" /language:csharp
  /n:*,SimpleClientWithProxy.ExchangeService
  "https://localhost/ExchangeService/ExchangeService.svc"

生成產物

  • 代理類:實現服務介面,內部調用 Channel 進行跨邊界通訊
  • App.config:含 system.serviceModel 完整配置,建議用 SvcConfigEditor.exe 管理

SvcConfigEditor

選型指導原則

「為什麼不用 IIS?」—— 企業級關鍵業務優先選 IIS/WAS,功能最完整。桌面進程間通訊選 Console/WinForms。Windows Service 為 IIS 替代方案,適用需高級啟動/生命週期控制的伺服器產品。

作者簡介

Chris Peiris:Avanade 解決方案架構師,WCF/BizTalk/EAI 專家,多本技術書合著者。
Dennis Mulder:Avanade 顧問,專注 SOA/集成/軟體工廠,INETA 講師。

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