爲何asp.net落後了,還講這些?由於mvc 仍是沿用老框架的,加了一個請求模塊,在第七個事件中觸發;web
1、概念api
HTTP模塊(HttpModule)是經過實現IHttpModule接口和處理事件,在每次針對應用程序發出請求時調用的程序集。HTTP模塊做爲ASP.NET請求管線的一部分調用,可以在整個請求過程當中訪問生命週期事件。所以,HTTP模塊使咱們有機會檢查傳入和傳出的請求,並根據該請求採起操做,甚至咱們能夠經過實現HTTP模塊來參與ASP.NET的運行管理。 瀏覽器
2、託管管道模式(IIS應用程序池)服務器
1. 經典模式架構
在IIS7以前,ASP.NET是以IIS ISAPI Extension的方式外加到IIS。而後IIS根據要求的內容類型作判斷,若是是HTML靜態網頁就由IIS自行處理,若是不是,就根據要求的內容類型,分派給各自的IIS ISAPI Extension,若是要求的內容類型是ASP.NET,就分派給負責處理ASP.NET的IIS ISAPI Extension,也就是aspnet_isapi.dll。IIS7應用程序池託管管道模式中的「經典模式」也是這樣的工做原理,這種模式是兼容IIS 6的方式,以減小升級成本。下圖是這個架構的示意圖:mvc
2. 集成模式app
IIS7徹底整合 .NET 以後,架構的處理順序有了很大不一樣,最大變化是ASP.NET從IIS插件(ISAPI Extension)的角色進入了 IIS 核心,而且能以ASP.NET模塊處理IIS7的諸多類型要求。這些ASP.NET模塊不僅能處理ASP.NET網頁程序,也能處理其餘程序;看圖吧:框架
3. IIS五、IIS6中的生命週期,處理順序asp.net
a. 用戶從Web服務器請求應用程序資源。性能
ASP.NET應用程序的生命週期以瀏覽器向Web服務器(對於ASP.NET應用程序,一般爲IIS)發送請求爲起點。ASP.NET是Web服務器下的ISAPI擴展。Web服務器接收到請求時,會對所請求文件的文件擴展名進行檢查,肯定應由哪一個ISAPI擴展處理該請求,而後將該請求傳遞給合適的ISAPI擴展。ASP.NET處理已映射到其上的文件擴展名,如.aspx、.ascx、.ashx 和 .asmx。
若是文件擴展名還沒有映射到ASP.NET,則ASP.NET將不會接收該請求。對於使用ASP.NET身份驗證的應用程序,理解這一點很是重要。 例如.htm 文件,一般沒有映射到ASP.NET,所以ASP.NET將不會對.htm 文件請求執行身份驗證或受權檢查,所以,即便文件僅包含靜態內容,想要 ASP.NET 檢查身份驗證,應使用映射到ASP.NET的文件擴展名建立該文件,如採用.aspx文件擴展名。
若是要建立服務於特定文件擴展名的自定義處理程序(httphandler),必須在IIS中將該擴展名映射到ASP.NET,還必須在應用程序的Web.config文件中註冊該處理程序。
b.ASP.NET接收對應用程序的第一個請求。
當ASP.NET接收到對應用程序中任何資源的一個請求時,名爲ApplicationManager的類會建立一個應用程序域。www站點運行於其中。咱們都知道,在同一個IIS上,兩個web應用程序的應用程序域都是獨立的(隔離的)。所以一個應用程序域中問題不會影響到其它應用程序域。在應用程序域中,將爲名爲 HostingEnvironment的類建立一個實例,該實例提供有關應用程序的信息(如存儲該應用程序的文件夾名稱)訪問。
下面的關係圖說明了這種關係:
c. 爲每一個請求建立ASP.NET核心對象。
建立應用程序域並對HostingEnvironment對象進行了實例化以後,ASP.NET將建立並初始化核心對象,如HttpContext、HttpRequest和HttpResponse。HttpContext類包含特定於當前應用程序請求的對象,如 HttpRequest和HttpResponse對象。HttpRequest對象包含有關當前請求的信息,包括Cookie和瀏覽器信息。HttpResponse對象包含發送到客戶端的響應,包括全部呈現的輸出和Cookie。
d.將HttpApplication對象分配給請求。
初始化全部核心應用程序對象以後,將經過建立HttpApplication類的實例啓動應用程序。若是應用程序具備Global.asax文件,則ASP.NET將建立Global.asax類(從 HttpApplication 類派生)的一個實例,並使用該派生類表示應用程序。
第一次在應用程序中請求ASP.NET頁或進程時,將建立HttpApplication的一個新實例。爲了儘量提升性能,可對多個請求重複使用HttpApplication實例。
建立HttpApplication的實例時,將同時建立全部已配置的模塊。建立了全部已配置的模塊以後,將調用HttpApplication類的Init 方法。
下面的關係圖說明了這種關係:
e: 由HttpApplication管線處理請求。
在處理該請求時將由HttpApplication 類執行HttpModule事件。
4. IIS7中的生命週期
a.發出一個對應用程序資源的請求。
ASP.NET應用程序的生命週期以瀏覽器向Web服務器發送請求爲起點。
在IIS7.0經典模式下,以及IIS6.0中,ASP.NET請求管道與Web服務器管道分離,模塊僅應用於路由到ASP.NET ISAPI擴展的請求,若是請求資源類型的文件擴展名未顯式映射到 ASP.NET,則不會爲該請求調用ASP.NET功能,如靜態文件,緣由是ASP.NET運行時沒有處理該請求。
而在IIS7.0集成模式下,由一個統一的管道處理全部請求,當集成管道收到請求時,該請求將經歷全部請求共有的一些階段,這些階段由RequestNotification枚舉表示,全部請求均可以配置爲使用ASP.NET功能,該功能封裝在能夠訪問請求管道的託管代碼模塊中。例如,即便 .htm文件擴展名未顯式映射到ASP.NET,對HTML頁的請求仍會調用ASP.NET模塊。這使得咱們能夠對全部資源使用ASP.NET身份驗證和受權。
b. 統一管道接收對應用程序的第一個請求。
當統一管道接收對應用程序中的任何資源的第一個請求時,將爲ApplicationManager類建立一個實例,該實例就是處理請求的應用程序域,應用程序域提供了應用程序之間全局變量的分離,而且使每一個應用程序可以單獨卸載。在應用程序域中,將爲HostingEnvironment類建立一個實例,該實例提供對有關應用程序的信息(如存儲該應用程序的文件夾的名稱)的訪問。
c. 將爲每一個請求建立響應對象。
在建立應用程序域並對HostingEnvironment對象進行實例化以後,將建立並初始化應用程序對象,如 HttpContext、HttpRequest和HttpResponse。HttpContext類包含特定於當前應用程序請求的對象,如 HttpRequest和HttpResponse對象。HttpRequest對象包含有關當前請求的信息,包括 Cookie 和瀏覽器信息。HttpResponse對象包含發送到客戶端的響應,其中包括全部呈現的輸出和Cookie。
d.將HttpApplication對象分配給請求。
初始化全部應用程序對象以後,將經過建立HttpApplication類的實例來啓動應用程序。若是應用程序有 Global.asax文件,則ASP.NET將建立從HttpApplication類派生的Global.aspx類的實例。而後使用該派生類來表示應用程序。
第一次在應用程序中請求ASP.NET頁或進程時,將建立HttpApplication類的一個新實例。爲了儘量提升性能,可對多個請求重複使用HttpApplication 實例。
加載哪些ASP.NET模塊取決於應用程序從父應用程序繼承的託管代碼模塊,還取決於在應用程序的Web.config文件的配置節中配置了哪些模塊。在應用程序的Web.config的 system.webServer節中的modules元素中添加或移除模塊。我會專門寫一張文章記錄經常使用的webconfig
f.由HttpApplication 管線處理請求。
在處理請求時,HttpApplication類會執行一些系列的事件,若是是開發自定義模塊,而且但願對發往管道的全部請求都調用該模塊,則這些事件也頗有用。自定義模塊實現IHttpModule接口,在IIS7.0集成模式下,必須在模塊的Init方法中註冊事件處理程序。