ASP.NET 請求處理流程

來源:互聯網
上載者:User
文章目錄
  • 其他
HTTP 處理流程圖

 

以上流程的一些概念解釋:

1.http.sys

是一個位於Win2003和WinXP SP2中的作業系統核心組件,能夠讓任何應用程式通過它提供的介面,以http協議進行資訊通訊。

  溫馨提示:如果使用者不慎刪除了該驅動檔案,不用擔心,該驅動會在下次系統啟動時重建。是一個刪不掉的系統核心組件!公用程式結束該驅動,該驅動也會馬上重新建立(只有粉碎檔案才不能馬上重建,但粉碎後,下次啟動會重建)。

  微軟在Windows 2003 Server裡引進了新的HTTP API和kernel mode driver Http.sys,目的是使基於Http服務的程式更有效率。這個改變的直接收益者就是IIS 6.0和ASP.NET。

  其實在Windows XP安裝SP2後,Http.sys已經出現在系統裡了,但事實上,作業系統並沒有真的使用這個核心級驅動,而XP上內建的IIS 5.1也沒有使用HTTP API。

  新的HTTP API裡最核心的變化都封裝在Http.sys這個kernel mode driver裡了。在此之前,基於HTTP協議的程式都是在User mode下啟動並執行,而且必須自己處理諸如軟體中斷、context switch、線程調度等等問題,並且往往無法自由接觸系統資源。過去,HTTP伺服器,如IIS, Apache等都是利用Winsock API來建立一個User mode下的network listener。Network listener通常獨自(i.e.: per application or per thread basis)佔用一個IP連接埠。通俗點說,就是在同一時間只有一個應用程式可以監聽一個連接埠,這在有些時候是一個不太令人舒服的限制。

  新的Http.sys帶來的好處大致有如下一些:

  1. 緩衝 - 靜態內容現在被緩衝於核心模式下,這使服務響應速度更快

  2. 記錄 (Log)-IIS的log功能更快且標準化了

  3. 頻寬控制 - greater scalability control and throttling

  4. 可靠性 - 所有的服務要求會在Http.sys裡暫存入隊列,而不是由服務程式本身來處理,這樣,即使服務程式重啟,尚未被處理的請求也不會丟失了

  5. IP連接埠重用 - 現在,只要是通過Http.sys管理的連接埠(基本包括了那些著名的連接埠,比如80),都可以同時允許多個程式同時監聽了。

2.應用程式集區

應用池即應用程式集區:
在Microsoft IIS6中引入了應用程式集區,這是微軟的一個全新概念:應用程式集區是將一個或多個應用程式連結到一個或多個背景工作處理序集合的配置。因為應用程式集區中的應用程式與其他應用程式被背景工作處理序邊界分隔,所以某個應用程式集區中的應用程式不會受到其他應用程式集區中應用程式所產生的問題的影響。 Windows 2003同時支援兩種工作模式,預設為ISS 6.0背景工作處理序隔離模式。背景工作處理序隔離模式防止一個應用程式或網站停止了而影響另一個應用程式或網站,大大增強了IIS的可靠性。那麼如何設定兩種工作模式呢?
啟動IIS管理器,右擊網站,選擇“屬性”,開啟屬性對話方塊。在IIS 6.0背景工作處理序隔離模式下,所有的應用程式代碼都在隔離環境中運行,它們是如何進行隔離的呢?Windows 2003新增了應用程式集區,背景工作處理序隔離模式允許客戶建立多個應用程式集區,每個應用程式集區都可以有不同的配置。因為這些應用程式集區直接從核心(而非WWW 服務)接收它們的請求,所以效能和可靠性得到了增強。要隔離運行在同一台電腦上但屬於不同網站的Web應用程式,需要為每個網站建立單獨的應用程式集區。
建立應用程式集區
在IIS管理器中,開啟本機電腦,按右鍵“應用程式集區”,選擇建立“應用程式集區” (必須在背景工作處理序隔離模式下才能建立應用程式集區) 。“應用程式集區名稱”框中,輸入新的應用程式集區名稱。如果在“應用程式集區 ID”框中出現的 ID (如:AppPool #1)不是您想要的,可進行重新命名。如果您單擊了“將現有應用程式集區作為模板”,請在“應用程式集區名稱”框中按右鍵想要用來作為模板的應用程式集區。最後單擊[確定]。
指派應用程式集區
在 IIS 管理器中,按右鍵您要為其指派應用程式集區的應用程式,然後單擊“屬性”。 單擊“主目錄”選項卡,確認您正在指派的目錄或虛擬目錄的“應用程式名稱”是否已被填寫。如果“應用程式名稱”框尚未被填寫,請單擊“建立”,然後輸入名稱。
在“應用程式集區”列表框中,選擇您想要為其指派的應用程式集區的名稱。最後單擊[確定]。

 

 3.aspnet_isapi.dll

 這個檔案是asp.net的處理檔案,用於處理asp.net在iis中註冊過副檔名的檔案比如預設的.aspx檔案註冊到aspnet_isapi.dll,這樣使用者訪問.aspx檔案時,伺服器自動調用aspnet_isapi.dll來處理這個檔案.

這個DLL是asp.net底層的一個類庫,這是它的介紹:

當用戶端向web伺服器請求一個*.aspx的分頁檔時,同asp類似,這個http請求也會被inetinfo.exe進程截獲(www服務),它判斷檔案尾碼之後,把這個請求轉交給ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL則會通過一個Http PipeLine的管道,將這個http請求發送給ASPNET_WP.EXE進程,當這個HTTP請求進入ASPNET_WP.EXE進程之後,asp.net framework就會通過HttpRuntime來處理這個Http請求,處理完畢後將結果返回給用戶端。

 

4.CLR

http://developer.51cto.com/art/200910/158022.htm

http://developer.51cto.com/art/200909/152551.htm

5.AppDomain

http://www.cnblogs.com/chorrysky/archive/2008/07/16/1244089.html

6.ISAPIRuntime

管理 .NET Framework 中的 HttpWorkerRequest (此抽象類別定義由 ASP.NET Managed 程式碼用於處理請求的基本輔助方法和枚舉)對象。

 

-----------------------------------------------------------------------------------------------------------------------------

當第一個請求到達時的動作如所示: 

 

 

初始化所有核心應用程式物件之後,將通過建立 HttpApplication 類的執行個體啟動應用程式。如果應用程式具有 Global.asax 檔案,則 ASP.NET 會建立 Global.asax 類(從 HttpApplication 類派生)的一個執行個體,並使用該衍生類別表示應用程式。

 

每次http請求都會有一個HttpApplication類型的對象來管理這次請求的過程。

為每次http請求建立一個HttpContext對象,此對象在整個Http處理過程中都是可訪問的。

 

HttpApplication對象負責裝配出整個“HTTP請求處理管線(HTTP Pipeline)”,這相當於一條加工流水線,讓HttpContext對象在這條線上過一遍。

HttpContext對象經過流水線的不同部分時,HttpApplication對象會先後激發出一連串的事件。HTTP模組(HTTP Module)可以響應這些事件,在此事件響應代碼中可以對HttpContext對象進行“加工和處理”。

HTTP模組可以看成是“生產流水線”中的工人。

HTTP模組對象是在HttpApplication對象的InitModules()方法中被建立的,建立時會調用其init方法,我們一般在HTTP模組對象Init()方法中書寫代碼對HttpApplication對象的事件進行註冊。

 

在流水線的中部(處理完了相關的事件),HttpContext對象被最終的Page對象所接收(這就是為何可以在ASP.NET頁面中通過Page類定義的Context屬性訪問HttpContext對象的原因)。

每個被訪問的ASP.NET頁面都會被轉換為一個“派生自Page類的頁面類”

Page類實現了IHttpHandler介面,此介面定義了一個ProcessRequest()方法。

ASP.NET頁面類產生以後被自動編譯為程式集,然後其ProcessRequest()方法被自動調用。ProcessRequest()方法的執行結果再次被HttpContext對象所承載,控制又轉回到“HTTP請求處理流水線”中,HttpApplication對象繼續激發後繼的事件。這時,如果還有特定的HTTP模組響應這些事件,則它們會被自動調用。

 

HttpContext對象帶著最後的處理結果來到了“HTTP請求處理管線”的未端,其資訊被取出來,再次以aspnet_isapi.dll為橋樑傳送給工作者進程。工作者進程再將HTTP請求的處理結果轉給HTTP.SYS,由它負責將結果返回給瀏覽器。

我們所寫的那些頁面代碼,以及那一套複雜的頁面生命週期,都是整個asp.net周期中的一部分,所有IhttpHandler的操作,都是在Application的PreRequestHandlerExecute 事件和PostRequestHandlerExecute 事件之間完成的,IHttpHandler中的操作都是頁面層級的操作,他們不能跨出頁面這個範。

在應用程式層級的操作,應該使用IHttpModule。

 

要區分開HttpApplication和HttpApplicationState

HttpApplicationState是整個應用程式唯一的。
而HttpApplication則不是唯一的。

你在頁面中寫的Application[“key”] = “”value; 這個Application其實是HttpApplicationState

 

每一次請求都由一個HttpApplication對象來處理,在處理過程中,這個對象不能再處理其他請求,並發訪問時,會為不同訪問分配不同HttpApplication對象。

HttpApplicationFactory對象負責管理一個HttpApplication對象池,當有HTTP請求到來時,如果池中還有可用的 HttpApplication對象,則分配之,否則,建立一個新的HttpApplication對象。請求完畢後,HttpApplication會被回收以供再次使用。

 

每當新的HttpApplication對象建立時,都會根據配置建立新的Ihttpmodule對象,新的IHttpModule對象被建立時,其init方法就會被執行。

 

HttpApplication在不同處理階段觸發的事件列表

1. 對請求進行驗證,將檢查瀏覽器發送的資訊,並確定其是否包含潛在惡意標記。有關更多資訊,請參見 ValidateRequest 和指令碼侵入概述。

2. 如果已在 Web.config 檔案的 UrlMappingsSection 節中配置了任何 URL,則執行 URL 對應。

3. 引發 BeginRequest 事件。

4. 引發 AuthenticateRequest 事件。

5. 引發 PostAuthenticateRequest 事件。

6. 引發 AuthorizeRequest 事件。

7. 引發 PostAuthorizeRequest 事件。

8. 引發 ResolveRequestCache 事件。

9. 引發 PostResolveRequestCache 事件。

10. 根據所請求資源的副檔名(在應用程式的設定檔中映射),選擇實現 IHttpHandler 的類,對請求進行處理。如果該請求針對從 Page 類派生的對象(頁),並且需要對該頁進行編譯,則 ASP.NET 會在建立該頁的執行個體之前對其進行編譯。

11. 引發 PostMapRequestHandler 事件。

12. 引發 AcquireRequestState 事件。(載入初始化Session時候觸發)

13. 引發 PostAcquireRequestState 事件。

14. 引發 PreRequestHandlerExecute 事件。(在HTTP請求送入HttpHandler之前觸發)

15. 為該請求調用合適的 IHttpHandler 類的 ProcessRequest 方法(或非同步版 BeginProcessRequest)。例如,如果該請求針對某頁,則當前的頁執行個體將處理該請求。

16. 引發 PostRequestHandlerExecute 事件。(在HTTP請求送入HttpHandler之後觸發)

17. 引發 ReleaseRequestState 事件。(儲存Session狀態的時候觸發)

18. 引發 PostReleaseRequestState 事件。

19. 如果定義了 Filter 屬性,則執行響應篩選。

20. 引發 UpdateRequestCache 事件。(更新緩衝資訊的時候觸發)

21. 引發 PostUpdateRequestCache 事件。

22. 引發 EndRequest 事件。

其他

通過使用命名規範 Application_event(如 Application_BeginRequest),ASP.NET 可在 Global.asax 檔案中將應用程式事件自動綁定到處理常式。這與將 ASP.NET 頁方法自動綁定到事件(如頁的 Page_Load 事件)的方法類似。

如果副檔名尚未映射到 ASP.NET,則 ASP.NET 將不會接收該請求。對於使用 ASP.NET 身分識別驗證的應用程式,理解這一點非常重要。例如,由於 .htm 檔案通常沒有映射到 ASP.NET,因此 ASP.NET 將不會對 .htm 檔案請求執行身分識別驗證或授權檢查。因此,即使檔案僅包含靜態內容,如果希望 ASP.NET 檢查身分識別驗證,也應使用映射到 ASP.NET 的副檔名建立該檔案,如採用副檔名 .aspx。

如果要建立服務於特定副檔名的自訂處理常式,必須在 IIS 中將該副檔名映射到 ASP.NET,還必須在應用程式的 Web.config 檔案中註冊該處理常式。有關更多資訊,請參見 HTTP 處理常式介紹。

在AcquireRequestState事件(包含該事件) 到 PostRequestHandlerExecute事件(不包含該事件)之前這段時間裡,Session都是可用的。Httphandler的ProcessRequest方法也是在這段時間內被調用的,所以用在頁面中可以用Session[“key”]來訪問Session。

 

其他參考:http://www.cnblogs.com/stg609/articles/1224943.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.