前言
任何一個程序的運行都需要依賴一個確定的進程中,WCF服務也不例外。如果使用WCF服務,我們就必須將服務承載於創建它並控制它的上下文和生存期的運行時環境中,承載服務環境的程序,我們稱之為宿主。WCF服務可以在支持托管代碼的任意Windows進程中運行。WCF 提供了統一編程模型,用於生成面向服務的應用程序。 此編程模型保持一致且獨立於部署服務的運行時環境。 實際上,這意味着不管使用什么宿主選項,服務的代碼看起來都非常類似。
這些宿主選項可以是控制台應用程序,也可以是服務器環境(如 Internet 信息服務 (IIS) 或 Windows 進程激活服務 (WAS) 管理的工作進程內運行的 Windows 服務)。 開發人員可以選擇滿足服務部署要求的宿主環境。 這些要求可能源自部署應用程序的平台,它必須發送和接收消息的傳輸,或者進程回收的類型和為確保足夠可用性所需的其他進程管理,或者某些其他管理或可靠性要求。
WCF宿主環境主要有以下幾種方式
- 托管應用程序中的自承載
WCF 服務可以承載於任何托管應用程序中。 這是最靈活的選項,因為它需要部署的基礎結構最少。 在托管應用程序代碼內嵌入服務代碼,然后創建並打開 ServiceHost 的實例以使服務變為可用。
此選項有兩個常見方案:在控制台應用程序內運行的 WCF 服務;以及客戶端應用程序,如基於 Windows Presentation Foundation (WPF) 或 Windows 窗體 (WinForms) 的應用程序。 在應用程序的開發階段中,將 WCF 服務承載於控制台應用程序內通常是很有用的。 這使服務變得容易調試,從中跟蹤信息以查明應用程序內發生的情況變得更加方便,以及通過將其復制到新的位置進行來回移動變得更加輕松。 此宿主選項還使客戶端應用程序(如 WPF 和 WinForms 應用程序)與外部世界的通信變得很容易。 例如,一個將 WPF 用於其用戶界面並作為 WCF 服務主機的對等協作客戶端,允許其他客戶端連接到它並共享信息。
2. 托管 Windows 服務
此宿主選項包括注冊 WCF 服務作為托管 Windows 服務(以前稱為 NT 服務)承載於其中的應用程序域 (AppDomain),以便服務的進程生存期由 Windows 服務的服務控制管理器 (SCM) 控制。 與自承載選項一樣,此類型的宿主環境要求作為應用程序的一部分編寫某些宿主代碼。 通過使服務從 ServiceBase 類以及從 WCF 服務協定接口繼承,將該服務同時實現為 Windows 服務和 WCF 服務。 然后創建 ServiceHost,在被重寫的 OnStart(String[]) 方法內打開它並在被重寫的 OnStop() 方法內關閉它。 還必須實現從 Installer 繼承的安裝程序類,以允許 Installutil.exe 工具將程序安裝為 Windows 服務。在未激活消息的安全環境中,由托管 Windows 服務宿主選項啟用的方案是承載於 IIS 之外、長時間運行的 WCF 服務的方案。 服務的生存期改由操作系統控制。 此宿主選項在 Windows 的所有版本中都是可用的。
3. Internet 信息服務 (IIS)
IIS 宿主選項與 ASP.NET 集成在一起,並使用這些技術提供的功能,如進程回收、空閑關閉、進程狀況監視和基於消息的激活。 在 Windows XP 和 Windows Server 2003 操作系統上,這是作為必須高度可用且高度可伸縮的 Web 服務應用程序宿主的首選解決方案。 IIS 還提供了客戶期望企業級服務器產品具有的集成可管理性。 此宿主選項要求正確配置 IIS,但不需要編寫任何承載代碼作為應用程序的一部分。
請注意,以 IIS 為宿主的服務只能使用 HTTP 傳輸。 它在 IIS 5.1 中的實現在 Windows XP 中引入了一些限制。 在 Windows XP 上由 IIS 5.1 為 WCF 服務提供的基於消息的激活阻止同一計算機上任何其他自承載的 WCF 服務使用端口 80 進行通信。 在 Windows Server 2003 上承載於 IIS 6.0 中時,WCF 服務可以運行在與其他應用程序相同的 AppDomain/應用程序池/工作進程中。 但是,由於 WCF 和 IIS 6.0 都使用內核模式 HTTP 堆棧 (HTTP.sys),因此 IIS 6.0 可以與在同一計算機上運行的其他自承載 WCF 服務共享端口 80,這與 IIS 5.1 是不同的。
4. Windows 進程激活服務 (WAS)
Windows 進程激活服務 (WAS) 是在 Windows Vista 上也可用的 Windows Server 2008 的新進程激活機制。 它保留了熟悉的 IIS 6.0 進程模型(應用程序池和基於消息的進程激活)和承載功能(如快速失敗保護、狀況監視和回收),但是它從激活體系結構中移除了對 HTTP 的依賴。 IIS 7.0 使用 WAS 通過 HTTP 完成基於消息的激活。 其他 WCF 組件也插入了 WAS,以通過 WCF 支持的其他協議(如 TCP、MSMQ 和命名管道)提供基於消息的激活。 這樣,使用通信協議的應用程序就可以使用 IIS 功能(如進程回收、快速失敗保護)和僅對基於 HTTP 的應用程序可用的通用配置系統。此承載選項要求正確配置 WAS,但不要求編寫任何承載代碼作為應用程序的一部分。
WCF宿主環境主要特點