公開 WCF 服務需提供執行環境(宿主)。如同 .NET CLR 需宿主執行代碼,WCF 宿主運行於應用程式域,可建立一或多個 ServiceHost 實例。

一般不建議在單一應用程式域建立多個 ServiceHost;若需裝載多服務,宜在單一宿主內透過多端點公開。僅當需要不同安全性內容時,才建立多個 ServiceHost。
本文以統一服務合約 IDocumentsExplorerService、實作類別 DocumentsExplorerService 及資料合約 Document、DocumentList 為例,逐一示範。
在主控台、WinForms 或 ASP.NET 應用程式中,使用 ServiceHost<T> 的 Open()/Close() 即可。必須確保宿主進程在服務期間不關閉(主控台用 Console.Read() 阻塞,WinForms 放在主視窗邏輯)。
using (ServiceHost host = new ServiceHost(typeof(DocumentsExplorerService)))
{
host.Open();
Console.WriteLine("The Service had been launched.");
Console.Read();
}
app.config 需設定 <baseAddresses>、端點繫結(如 basicHttpBinding)、中繼資料交換端點等。客戶端 app.config 需對應服務位址與繫結設定。
優缺點:簡單易實作,適合開發測試/演示;但缺乏易用性、管理性、可靠性與效能保障,企業級極少採用。支援所有繫結。
克服自裝載缺點:易於啟動/停止、故障自動重啟、可設為自動啟動、具備 SCM 管理、安全性與日誌機制。
實作步驟:建立 Windows Service 專案 → 繼承 ServiceBase → 覆寫 OnStart()/OnStop() 建立/關閉 ServiceHost → 加入 app.config(內容同自裝載) → 建立安裝類 (Installer) → 以 installutil.exe 安裝。
protected override void OnStart(string[] args)
{
if (m_serviceHost != null) m_serviceHost.Close();
m_serviceHost = new ServiceHost(typeof(DocumentsExplorerService));
m_serviceHost.Open();
}
protected override void OnStop()
{
if (m_serviceHost != null) { m_serviceHost.Close(); m_serviceHost = null; }
}


評價:非 Vista 環境下企業級首選,支援所有繫結、限制最小;缺點是部署相對複雜(需 installutil 或安裝專案自訂動作)。
需加入 .svc 檔案(或直接建立 WCF Service 專案)。.svc 透過 @ServiceHost 指令指定服務型別、語言、除錯模式、CodeBehind 等。服務程式碼/組件限制放置於:.svc 內嵌、GAC、Bin 目錄、App_Code 目錄四處之一。

自訂 ServiceHost 需實作 ServiceHostFactory 並在 @ServiceHost Factory=... 指定。
web.config 設定與自裝載類似,但無基底位址——IIS 自動以 .svc 虛擬路徑為基底位址(如 https://localhost/DocumentsExplorer/HostService.svc)。

致命弱點:僅支援 HTTP 繫結,無法在區域網路利用 TCP、MSMQ、Peer-to-Peer 等高效傳輸。
WAS 為 IIS 7.0 核心組件,可獨立安裝,支援所有 WCF 傳輸協定、連接埠與佇列,突破 IIS 6.0 僅限 HTTP 的限制。裝載方式與 IIS 大同小異(同需 .svc、虛擬目錄/應用程式、應用程式集區設定),但繫結不再受宿主限制。