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


ASP.NET和ASP.NET MVC的HttpApplication請求處理管道有共同的部分和不同之處,本系列將體驗ASP.NET MVC請求處理管道生命周期的19個關鍵環節。

 

  ①以IIS6.0為例,首先由w3wp.exe維護着一個工作進程


1

 

  ②如果是第一次加載,由Aspnet_isapi.dll加載.NET運行時


2

 

  ③一個工作進程里有一個應用程序池,其中可以承載多個應用程序域AppDomain


3

 

  ④HTTP.SYS接收請求,通過應用程序域工廠AppDomainFactory創建應用程序域AppDomain


4

 

  ⑤一個IsapiRuntime被加載,並創建一個IsapiWorkerRequest對象封裝當前的HTTP請求,並把該IsapiWorkerRequest對象傳遞給ASP.NET的HttpRuntime運行時,此時,  HTTP請求開始進入ASP.NET請求管道


5

 

也就是說,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處理請求


6

 

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個關鍵環節系列包括:

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

ASP.NET MVC請求處理管道生命周期的19個關鍵環節(7-12)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM