關于WCF Windows Services宿主使用揭秘
WCF 還是比較常用的,于是我研究了一下Windows Services宿主,在這里拿出來和大家分享一下,希望對大家有用。在WCF Windows Services宿主則完全克服了自托管宿主的缺點,它便于管理者方便地啟動或停止服務,且在服務出現(xiàn)故障之后,能夠重新啟動服務。我們還可以通過 Service Control Manager(服務控制管理器),將服務設置為自動啟動方式,省去了服務的管理工作。此外,Windows Services自身還提供了一定的安全性以及檢測機制和日志機制。
#T#WCF Windows Services宿主的實現(xiàn)也非常簡單。我們可以在Visual Studio中創(chuàng)建Windows Services項目。在創(chuàng)建項目之后,就可以創(chuàng)建一個繼承System.ServiceProcess.ServiceBase類的Windows服務類。Windows服務類繼承了ServiceBase類的OnStart()和OnStop()方法,完成Windows服務的啟動與停止。我們可以重寫這兩個方法,將ServiceHost的啟動與關閉對應地放入這兩個方法的實現(xiàn)中。例如我們創(chuàng)建的 DocumentsExplorerWindowsService類:
- namespace BruceZhang.WCF.DocumentsExplorer
- {
- public partial class DocumentsExplorerWindowsService : ServiceBase
- {
- private ServiceHost m_serviceHost = null;
- public static void Main()
- {
- ServiceBase.Run(new DocumentsExplorerWindowsService());
- }
- public DocumentsExplorerWindowsService()
- {
- InitializeComponent();
- ServiceName = "DocumentsExplorerService";
- }
- 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;
- }
- }
- }
- }
在Main函數(shù)中,我們通過ServiceBase.Run()靜態(tài)方法創(chuàng)建Windows服務實例,并在Windows服務類的構造函數(shù)中,調用 ServiceBase類的ServiceName屬性指定服務名。在重寫的OnStart()方法中,我們首先判斷是否已經存在ServiceHost 實例,如果不存在,則創(chuàng)建它。創(chuàng)建ServiceHost實例的方法與自托管宿主方式相同。
為了完成ServiceHost實例的創(chuàng)建,我們同樣需要在項目中添加app.config配置文件,配置文件的內容與前完全一樣。
如果在企業(yè)應用中要使用WCF技術,最佳的宿主方式我認為就是WCF Windows Services宿主,尤其是服務器的操作系統(tǒng)不是Vista的情況之下。它便于服務的管理,能夠維持服務長時期的運行,同時它還支持所有的綁定,因而受到的限制最小。然而,這種方式唯一的缺點卻是對宿主的部署相對比較復雜,必須通過.NET提供的Installutil.exe工具完成對服務宿主的安裝(也可以通過安裝包的自定義操作完成)。