ASP.NET MVC請求處理管道生命週期的19個關鍵環節(1-6)

來源:互聯網
上載者:User

標籤: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) {}......

未完待續~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.