標籤:names nfa inter 載入 支援 傳回值 反射 應用程式 回收
IIS7在請求的監聽和分發機制上進行了革新性的改進,主要體現在對於Windows進行啟用服務(Windows Process Activation Service ,WAS)的引入,將原來的W3SVC的部分功能分流給了WAS。W3SVC的主要功能:HttP請求接收、組態管理、進程管理。
IIS7將後兩組功能實現到了WAS中,接收Http請求的任務依然落在W3SVC上,WAS的引入為IIS7.0提供了對非Http協議的支援。WAS通過監聽器適配器介面抽象出針對不同協議的監聽器。具體說,除了給予網路驅動的HTTP.SYS提供的HTTP請求監聽功能外還提供了TCP監聽器、具名管道監聽器和MSMQ監聽器以提供基於TCP、具名管道和MSMQ傳說協議的監聽支援。這三種非HTTP監聽器和監聽適配器定義在程式集SMHost.exe中。
WCF提供的這三種監聽器和監聽適配器最終以Windows服務的形勢體現。可以通過服務工作管理器對其進行單獨的啟動、終止:
- NetTcpPortSharing:為WCF提供TCP連接埠共用。
- NetTcpActivator:為WAS提供給予TCP啟用的請求。
- NetPipeActivator:為WAS提供給予具名管道的啟用請求
- NetMsmqActivator:為WAS提供給予MSMQ的啟用請求
揭示了IIS7的整體架構及整個請求處理流程。無論是從W3SVC接收到的HTTP請求,還是通過WCF提供的監聽適配器接收到的請求,最終都會傳遞到WAS。如果相應的工作流程並未建立則建立它,否則將請求分發給對應的背景工作處理序進行後續的處理。WAS在進行請求處理過程中,通過內建的組態管理模組載入相關的配置資訊,並對相關的組件進行配置。。IIS7將配置資訊存放於XML形式的設定檔中,基本的配置存放在applicationHost.config中。
IIS7中實現了“你中有我,我中有你”的整合式管線設計
- 可以通過本地代碼和Managed 程式碼兩種方式定義IIS Module
- 將ASP.NET提供的一些強大功能應用到原來難以企及的地方比如URL重寫置於身分識別驗證之前
- 採用相同的方式去實現、配置、檢測和支援一些伺服器特性比如:Module、Handler映射、定製錯誤配置等
請求管道的處理
主要描述ASP.NET請求的處理(粗略的)
如果HTTP.SYS接收到的HTTP請求時對該Web應用的第一次訪問,在成功載入了運行時後,IIS會通過AppDomainFactory為該Web應用建立一個應用程式定義域,隨後一個特殊的運行時IsapiRuntime被載入。IsapiRuntiome定義在程式集System.Web中,對應的命名空間為System.Web.Hosting,被載入的IsapiRuntime會接管該Http請求。
IsapiRuntime會首先建立一個IsapiWorkerRequest對象,用於封裝當前的Http請求,並將IsapiWorkerRequest對象床底給ASP.NET運行時HttpRuntime、從此時起,Http請求正式進入了ASP.NET管道。HttpRuntime會根據IsapiWorkerRequest對象建立用於標示當前Http請求的內容物件HttpContext。
隨著HttpContext被建立成功,HttpRuntime會利用HttpApplication建立新的或擷取現有的HttpApplication對象。實際上ASP.NET維護者一個HttpApplication對象池,HttpApplication從翅中選取可用的HttpApplication用於處理HTTP請求,處理完畢後將其釋放到對象池中。HttpApplication負責處理當前的HTTP請求。
在HttpApplication初始化過程中,會根據設定檔載入並初始化相應的HttpModule對象。對於Httpapplication來說,在它處理HTTP請求的不同階段會觸發不同的事件(Event),而HttpModule的意義在於通過註冊HttpApplication相應的事件,將所需的操作注入整個HTTP請求的處理流程。asp.net的很多功能,比如:身分識別驗證、授權、緩衝等,都是通過相應的HttpModule實現的
最終實現對HTTP請求的處理實現在HttpHandler中,對於不同的資源類型,具有不同的HttpHandler。比如aspx頁面對應的HttpHandler為System.Web.UI.Page,WCF的.svc檔案對應的Httphandler為System.ServiceModel.Activation.HttpHandler。整個的流程圖:
HttpApplication
HttpApplication是整個ASP.NET基礎架構的核心,它負責處理分發給他的HTTP請求。由於一個HttpApplication對象在某個時刻只能處理一個請求,只有完成對某個請求的處理後,HttpApplication才能用於後續的請求處理。所以ASP.NET採用對象池的機制來建立或擷取HttpApplication獨享。
當第一個請求抵達時,ASP.NET會一次建立多HttpApplication對象,並將其置於池中。選擇其中一個對象來處理該請求。處理完畢後,HttpApplication不會被回收,而是釋放到池中。對於後續的請求,閒置HttpApplication對象會從池中取出,如果池中HttpApplication對象都處於繁忙狀態,ASP.NET會建立新的HttpApplication對象。
HttpModule
當請求轉入ASP.NET管道時,最終負責處理該請求的是與請求資源類型相匹配的HttpHandler對象,但是在Handler正式工作之前,ASP.NET會先載入並初始化所有配置的HttpModule對象。HttpModule在初始化過程中,會將一些功能註冊到HttpApplication相應的事件中,在HttpApplication請求處理生命週期的某個階段,相應的事件會被觸發,通過HttpModule註冊的事件處理常式得以執行。
所有的HttpModule都實現了具有如下定義的System.Web.IHttpModule介面,其中Init()用於實現HttpModule自身的初始化,該方法接收一個HttpApplication對象,,有了這個對象,事件註冊就很容易了
1 namespace System.Web 2 { 3 using System; 4 5 public interface IHttpModule 6 { 7 void Dispose(); 8 void Init(HttpApplication context); 9 }10 }
基於HttpModule實現的功能:
- OutputCacheModule:實現了輸出緩衝的功能
- SessionStateModule:在無狀態的HTTP協議上實現了基於會話的Session的狀態
- WindowsAuthenticationModule+FormsAuthenticationModule+PassportAuthenticationModule:實現了windows、Forms和Passport這3種經典的身分識別驗證
- UrlAuthorizationModule+FileAuthorizationModule:實現了基於URI和檔案ACL的授權
除了這些系統的HttpModule之外,還可以自訂HttpModule,通過WebConfig註冊。
HttpHandler
對於不同資源類型的請求,ASP.NET會載入不同的Handler來處理,也就是說.aspx頁與asmx web 服務對應的Handler是不同的。所有的HttpHandler都實現了具有入下定義的介面System.Web.IHttpHandler,ProcessRequest提供了處理請求的實現
1 namespace System.Web 2 { 3 using System; 4 5 public interface IHttpHandler 6 { 7 void ProcessRequest(HttpContext context); 8 9 bool IsReusable { get; }10 }11 }
某些HttpHandler具有一個與值相關的HttpHandlerFactory,它實現了具有如下定義的System.Web.IHttpHandlerFactory,方法GetHandler用於建立新的HttpHandler,或者擷取已經存在HttpHandler
1 namespace System.Web 2 { 3 using System; 4 5 public interface IHttpHandlerFactory 6 { 7 IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated); 8 void ReleaseHandler(IHttpHandler handler); 9 }10 }
Route
一個HTTP請求會經過至少一個HttpModule
的處理。UrlRoutingModule
是非常重要的模組,它是路由系統的核心。路由系統的職責是從請求URL中擷取controller和action的名稱以及其它請求資料。
UrlRoutingModule
根據當前請求的URL和RouteTable
中登入的路由模板進行匹配並返回第一個和當前請求相匹配的路有對象Route
,然後根據路有對象擷取路由資料對象RouteData
(ASP.NET MVC中,路由資料必須包含controller和action的名稱),再由RouteData
擷取IRouteHandler
最終由IRouteHandler
得到IHttpHandler
。
Controller
IHttpHandler
在ProcessRequest
方法中對當前請求進行處理,在該方法中通過ControllerBuilder
得到IControllerFactory
然後通過反射的方式擷取Controller
的類型。
Action
ASP.NET MVC中ControllerBase
是所有Controller
的基類,在該類型的Execute
方法中通過IActionInvoker
的InvokeAction
方法來執行對Action
的調用。在Action
執行前會進行模型繫結和模型認證操作。
Filters
常用的過濾器有5個:IAuthenticationFilter
、IAuthorizationFilter
、IActionFilter
、IResultFilter
、IExceptionFilter
。
在ASP.NET MVC中所有的過濾器最終都會被封裝為Filter
對象,該對象中FilterScope
類型的屬性Scope
和int
類型屬性Order
用於決定過濾器執行的先後順序,具體規則如下:
Order
和FilterScope
的數值越小,過濾器的執行優先順序越高;
Order
比FilterScope
具有更高的優先順序,在Order
屬性值相同時FilterScope
才會被考慮
1 //數值越小,執行優先順序越高2 public enum FilterScope3 {4 Action= 30,5 Controller= 20,6 First= 0,7 Global= 10,8 Last= 1009 }
View Code
ActionResult
Action
執行完畢之後會返回ActionResult
類型對象作為對此次請求進行處理的結果,對於不是ActionResult
類型的傳回值,ASP.NET MVC會將其轉換為ActionResult
類型。
請求生命週期
IIS7.0與AP.NET