應用承載WCF ServiceHost實例分析
WCF還是比較常用的,于是我研究了一下WCF ServiceHost,在這里拿出來和大家分享一下,希望對大家有用。.NET 應用程序需要一個作為宿主的 Windows 進程。該 Windows 進程內部可以承載多個 .NET 應用程序域。應用程序域是 .NET CLR 將托管代碼與 Windows 進行隔離所采用的一種手段。CLR 會在每個工作進程中進行初始化,并自動創建一個默認的應用程序域。該默認應用程序域運行于某個進程,并直到該進程結束時才會卸載。默認應用程序域的關閉是由 CLR 來控制的。
為了調用服務上的操作,客戶端首先需要把服務合同導入到客戶端的本地描述中。這意味著,該服務需要客戶端暴露一個標準方法以檢索它的元數據-這是通過讓服務暴露一個元數據交換(MEX)端點來實現的。只要服務在宿主上注冊至少一個TCP、HTTP或IPC基地址,那么,這個基于WCF的服務就能夠自動地暴露一個MEX端點。
#T#在大多數宿主中,默認應用程序域內部并不運行任何代碼。而是由宿主(或“進程”)來新建應用程序域,以便應用程序域可以獨立于進程而關閉。在很多應用程序中,理想的情況是客戶端代碼和服務器端代碼分別在不同應用程序域中執行。通常這種要求是出于安全性和隔離等原因的考慮。進程和應用程序域之間的關系類似于應用程序和應用程序域與 ServiceHostWCF 之間的關系。如圖所示,每個進程都至少有一個應用程序域,并且每個應用程序域都可以承載零個或更多的WCF ServiceHost 實例。WCF 需要一個 Windows 進程內部至少要承載一個應用程序域。
注意 盡管可以實例化多個 ServiceHost 實例,但每個應用程序域內保留一個 ServiceHost 實例更便于操作。您可以在一個宿主內使用多個端點公開多個服務接口。更高級的宿主(例如,IIS 和 WAS)確實可以實例化多個 ServiceHost 實例,以提供隔離和不同的安全上下文。
因此,宿主的主要任務是向 WCF ServiceHost 提供 Windows 工作進程和應用程序域。此外,WCF 依賴于應用程序域提供的安全和配置功能。Windows 進程始終使用默認標識運行,WCF 服務可隨時使用這個現成的標識。但是,WCF 提供了幾個級別的模擬用戶的功能。如果您不使用這些功能,則由運行服務的 Windows 進程提供安全上下文。前面幾章提到過,默認情況下 WCF 依賴于 .NET Framework 中的配置功能,您可以通過應用程序域對其進行訪問。
某些宿主還具有管理所運行的應用程序的其他功能。最為突出的是,IIS 還具備自動進程回收、資源限制、日志記錄、運行狀況指示器等其他功能。您可以通過整個章節的學習了解有關這些主題的詳細內容。(不同 IIS 版本具有受 WCF 支持的不同的可管理性功能。最為明顯的,Windows XP 中的 IIS 5.1 在管理用戶界面方面就受到一些限制。)