ASP.NET和ASP.NET MVC的HttpApplication請求處理管道有共同的部分和不同之處,本系列將體驗ASP.NET MVC請求處理管道生命周期的19個關鍵環節。
①以IIS6.0為例,首先由w3wp.exe維護着一個工作進程
②如果是第一次加載,由Aspnet_isapi.dll加載.NET運行時
③一個工作進程里有一個應用程序池,其中可以承載多個應用程序域AppDomain
④HTTP.SYS接收請求,通過應用程序域工廠AppDomainFactory創建應用程序域AppDomain
⑤一個IsapiRuntime被加載,並創建一個IsapiWorkerRequest對象封裝當前的HTTP請求,並把該IsapiWorkerRequest對象傳遞給ASP.NET的HttpRuntime運行時,此時, HTTP請求開始進入ASP.NET請求管道
也就是說,HttpRuntime是ASP.NET請求管道的入口。當請求進來,首先進入HttpRuntime,由HttpRuntime來決定如何處理請求。默認情況下,在machine.config和Web.config中並沒有顯式定義httpRuntime節點,但該節點是有默認值的,如下:
<httpRuntime apartmentThreading="false" appRequestQueueLimit="5000" delayNotificationTimeout="5" enable="true" enableHeaderChecking="true" enableKernelOutputCache="true" enableVersionHeader="true" encoderType = "System.Web.Util.HttpEncoder" executionTimeout="110" maxQueryStringLength = "2048" maxRequestLength="4096" maxUrlLength = "260" maxWaitChangeNotification="0" minFreeThreads="8" minLocalRequestFreeThreads="4" relaxedUrlToFileSystemMapping = "False" requestLengthDiskThreshold="80" requestPathInvalidCharacters = "<,>,*,%,&,:,\" requestValidationMode = "4.0" requestValidationType = "System.Web.Util.RequestValidator" requireRootedSaveAsPath="true" sendCacheControlHeader="true" shutdownTimeout="90" useFullyQualifiedRedirectUrl="false" waitChangeNotification="0" />
通常,我們可以在Web.config中更改httpRuntime節點的默認值,如下:
<configuration> <system.web> <httpRuntime maxRequestLength="4000" enable = "True" requestLengthDiskThreshold="512 useFullyQualifiedRedirectUrl="True" executionTimeout="45" versionHeader="1.1.4128"/> </system.web> </configuration>
⑥HttpRuntime維護着一個HttpApplication池,當有HTTP請求過來,從池中選取可用的HttpApplication處理請求
HttpApplication有19個管道事件,分別是:
1、BeginRequest:HTTP管道開始處理請求時,會觸發BeginRequest事件 2、AuthenticateRequest:安全模塊對請求進行身份驗證時觸發該事件 3、PostAuthenticateRequest:安全模塊對請求進行身份驗證后觸發該事件 4、AuthorizeRequest:安全模塊對請求進程授權時觸發該事件 5、PostAuthorizeRequest:安全模塊對請求進程授權后觸發該事件 6、ResolveRequestCache:緩存模塊利用緩存直接對請求進程響應時觸發該事件 7、PostResolveRequestCache:緩存模塊利用緩存直接對請求進程響應后觸發該事件 8、PostMapRequestHandler:對於訪問不同的資源類型,ASP.NET具有不同的HttpHandler對其進程處理。對於每個請求,ASP.NET會根據擴展名選擇匹配相應的HttpHandler類型,成功匹配后觸發該事件 9、AcquireRequestState:狀態管理模塊獲取基於當前請求相應的狀態(比如SessionState)時觸發該事件 10、PostAcquireRequestState:狀態管理模塊獲取基於當前請求相應的狀態(比如SessionState)后觸發該事件 11、PreRequestHandlerExecute:在實行HttpHandler前觸發該事件 12、PostRequestHandlerExecute:在實行HttpHandler后觸發該事件 13、ReleaseRequestState:狀態管理模塊釋放基於當前請求相應的狀態時觸發該事件 14、PostReleaseRequestState:狀態管理模塊釋放基於當前請求相應的狀態后觸發該事件 15、UpdateRequestCache:緩存模塊將HttpHandler處理請求得到的相應保存到輸出緩存時觸發該事件 16、PostUpdateRequestCache:緩存模塊將HttpHandler處理請求得到的相應保存到輸出緩存后觸發該事件 17、LogRequest:為當前請求進程日志記錄時觸發該事件 18、PostLogReques:為當前請求進程日志記錄后觸發該事件 19、EndRequest:整個請求處理完成后觸發該事件
我們可以在全局配置文件Global.asax中,按照約定的規則Application_{Event Name}來對管道事件定制:
void Application_Start(object sender, EventArgs e) {} void Application_End(object sender, EventArgs e) {} void Application_Error(object sender, EventArgs e) {} void Session_Start(object sender, EventArgs e) {} void Session_End(object sender, EventArgs e) {} ......
ASP.NET MVC請求處理管道生命周期的19個關鍵環節系列包括: