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