標籤:style class blog code http tar
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) {}......
未完待續~~