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


  前面的文章我們使用ASP.NET MVC創建了個博客應用,那么它是如何工作的呢?我們都知道ASP.NET的程序需要部署到IIS上才能夠通過瀏覽器來訪問,那么IIS與ASP.NET MVC程序之間又是如何工作的呢?

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

  ●IIS及其管道配置
  ●HttpApplication Events
  ●使用Global.asax注冊事件

IIS及其管道配置

  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的請求以及靜態文件請求的處理程序是不同的,它們處理的過程如下圖所示:

  

  從上圖中可以看出IIS接收到HTTP請求,這個請求經過了IIS和asp.net兩個管道處理后返回響應到客戶端,所以ASP.NET中的Forms驗證、Windows驗證等功能沒法對於靜態文件使用。
  而IIS的集成模式改變了這一現狀,在集成模式中,對於HTTP請求,IIS和ASP.NET的處理管道進行了合並,IIS復制接收所有的請求,所有請求都將經過這個被“合並”后的管道處理。這樣所有的請求包括靜態文件都可以經過身份驗證等處理。如下圖所示:

  

  上面介紹了IIS處理HTTP請求時是通過HttpModule來對請求通道完成拓展的,換句話說,如果需要新的功能那么也可以添加一個HttpModule在通道中即可,那么要如何對請求管道進行配置呢?web.config文件。
  在IIS的集成模式中,配置文件已經被統一了,通過web.config文件來對參與請求管道的HttpModule配置即可:

  

  上圖所示是創建一個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配置節點的默認值。

  

 

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

  

  

  從上面的配置可以看到,ASP.NET的默認配置已經幫助開發者完成了很多的工作,開發者只需要根據實際需求在網站級別的web.config中刪除不需要的或添加新的配置即可。
以下是新建一個ASP.NET MVC應用運行時的HTTP Module(部分):

  

HttpApplication Events

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

    

  注:上圖為部分事件處理器。
  根據執行順序排序:
  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 事件.

使用Global.asax注冊事件

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

  

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

  

  大部分方法:

  

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

  

  訪問這個action的執行結果:

   

  小結:
  本章介紹了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沒有魔法——目錄


免責聲明!

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



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