天天看點

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  前面的文章我們使用ASP.NET MVC建立了個部落格應用,那麼它是如何工作的呢?我們都知道ASP.NET的程式需要部署到IIS上才能夠通過浏覽器來通路,那麼IIS與ASP.NET MVC程式之間又是如何工作的呢?

  本章将從以下幾個方面對ASP.NET的運作周期進行介紹:

  ●IIS及其管道配置

  ●HttpApplication Events

  ●使用Global.asax注冊事件

  IIS(Internet Information Services)是微軟在Windows作業系統上提供的一款用于釋出網際網路服務的軟體,它除了可以作為Web伺服器以外還可以用于FTP伺服器、NNTP伺服器和SMTP伺服器。本章内容将介紹它作為Web伺服器時如何運作ASP.NET程式。

  IIS的Web伺服器有兩種模式一種是經典模式,經典模式是IIS6.0之前版本支援的模式,另一種是內建模式,內建模式是IIS7.0以上的預設模式。它們之間主要的差別是經典模式隻能使用C++等非托管的原生語言編寫HttpModule來對IIS進行擴充,而內建模式除了非托管語言外還.Net Framework托管的語言來編寫拓展。

  而且對于IIS的經典模式來說,ASP.NET僅僅是IIS的一個ISAPI拓展,通過在IIS中配置映射來決定目前請求使用哪個拓展來處理,ASP.NET的請求以及靜态檔案請求的處理程式是不同的,它們處理的過程如下圖所示:

  

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  從上圖中可以看出IIS接收到HTTP請求,這個請求經過了IIS和asp.net兩個管道處理後傳回響應到用戶端,是以ASP.NET中的Forms驗證、Windows驗證等功能沒法對于靜态檔案使用。

  而IIS的內建模式改變了這一現狀,在內建模式中,對于HTTP請求,IIS和ASP.NET的處理管道進行了合并,IIS複制接收所有的請求,所有請求都将經過這個被“合并”後的管道處理。這樣所有的請求包括靜态檔案都可以經過身份驗證等處理。如下圖所示:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  上面介紹了IIS處理HTTP請求時是通過HttpModule來對請求通道完成拓展的,換句話說,如果需要新的功能那麼也可以添加一個HttpModule在通道中即可,那麼要如何對請求管道進行配置呢?web.config檔案。

  在IIS的內建模式中,配置檔案已經被統一了,通過web.config檔案來對參與請求管道的HttpModule配置即可:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  上圖所示是建立一個ASP.NET MVC程式時,web.config檔案自動添加了一個名為ApplicationInsightsWebTracking的HttpModule,這個HttpModule的功能是用來追蹤監測請求資料的。

  另外在<system.web>節點下還有一個<httpHandlers>節點用于映射請求對應的處理器。

  IIS除了加載應用的web.config之外還會通過繼承機制“加載”伺服器級别的配置檔案:

  ● 伺服器級别的Machine.config,該檔案位于systemroot\Microsoft .NET\Framework\versionNumber\CONFIG\Machine.config,它包含了ASP.NET配置節點的預設值。

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  ● 根網站級别的web.config,該檔案位于systemroot\Microsoft .NET\Framework\versionNumber\Config\web.config,它提供了大部分的system.web章節的配置,如HttpHandler以及HttpModule:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?
ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  從上面的配置可以看到,ASP.NET的預設配置已經幫助開發者完成了很多的工作,開發者隻需要根據實際需求在網站級别的web.config中删除不需要的或添加新的配置即可。

以下是建立一個ASP.NET MVC應用運作時的HTTP Module(部分):

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  在IIS的內建模式下,由于ASP.NET的請求處理管道已經與IIS通道相連接配接,是以處理請求的整個通道的每一個步驟都以事件的方式暴露給了HttpApplication對象。

   

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

 

  注:上圖為部分事件處理器。

  根據執行順序排序:

  1. BeginRequest 事件.

  2. AuthenticateRequest 事件.

  3. PostAuthenticateRequest 事件.

  4. AuthorizeRequest 事件.

  5. PostAuthorizeRequest 事件.

  6. ResolveRequestCache 事件.

  7. PostResolveRequestCache 事件.

  8. MapRequestHandler 事件. 根據請求檔案的拓展名來選擇一個适合的處理器,這個處理器可以是非托管代碼編寫的子產品如StaticFileModule或者是托管代碼的子產品如PageHandlerFactory(它用來處理.aspx檔案). 

  9. PostMapRequestHandler 事件.

  10. AcquireRequestState 事件.

  11. PostAcquireRequestState 事件.

  12. PreRequestHandlerExecute 事件.

  13. 調用處理器的ProcessRequest方法 (或者是異步版本的).

  14. PostRequestHandlerExecute 事件.

  15. ReleaseRequestState 事件.

  16. PostReleaseRequestState 事件.

  17. 如果定義了過濾器則執行過濾器對相應資訊進行過濾.

  18. UpdateRequestCache 事件.

  19. PostUpdateRequestCache 事件.

  20. LogRequest 事件.

  21. PostLogRequest 事件.

  22. EndRequest 事件.

  23. PreSendRequestHeaders 事件.

  24. PreSendRequestContent 事件.

  在ASP.NET程式中可以通過Global.asax檔案來注冊這些事件,一般建立ASP.NET應用程式項目時将會自動建立一個Global.asax檔案,比如MVC應用中的Global.asax:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  MvcApplication繼承與HttpApplication類型,在這個類型中可以通過一個特殊的方法命名方式Application_{eventName}來注冊事件,比如Application_BeginRequest,這種注冊事件方法适用于上面的所有事件,另外Application_Start和Application_End是特殊的方法,不被包含于上面的事件中。

以下是部分注冊事件代碼:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  大部分方法:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  使用一個Action來測試事件的執行:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  通路這個action的執行結果:

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?

  小結:

  本章介紹了IIS經典模式和內建模式對請求的處理流程,并對HTTP Module和 HTTP Handler的配置進行了說明,最後通過代碼的方式實作了HttpApplication生命周期的事件的注冊和使用。

  參考:

  https://msdn.microsoft.com/en-us/library/bb470252.aspx

  https://docs.microsoft.com/en-us/iis/application-frameworks/building-and-running-aspnet-applications/aspnet-integration-with-iis

  https://msdn.microsoft.com/en-us/library/ms178685.aspx  

  https://weblog.west-wind.com/posts/2009/Jun/18/How-do-ASPNET-Application-Events-Work

  https://msdn.microsoft.com/en-us/library/ms178473.aspx

  本文位址:http://www.cnblogs.com/selimsong/p/7650129.html 

  ASP.NET沒有魔法——目錄

作者:7m魚

出處:http://www.cnblogs.com/selimsong/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

ASP.NET沒有魔法——ASP.NET MVC是如何運作的?它的生命周期是什麼?