ASP.NET 應用程序生命週期

一、請求到達IIS服務器,IIS根據文件後綴找到對應的ISAPI(Internet Server API)擴展來處理,這個配置可在網站屬性裏的「根目錄」選項卡中的「配置」裏看到。能夠看到,ashx、aspx配置的都是「aspnet_isapi.dll」,此ISAPI擴展咱們便稱之爲ASP.NET。html

二、ASP.NET加載CLR,在CLR初始化的時候會加載兩個重要的dll:AppManagerAppDomainFactory和ISAPIRuntime。web

三、AppManagerAppDomainFactory在構造方法中建立ApplicationManager對象,create方法調用ApplicationManager的對象方法建立了AppDomain的對象,並在此過程當中建立了HostingEnvironment的對象(該對象提供應用程序的物理路徑、虛擬路徑等信息)。api

四、ISAPIRuntime的ProcessRequest方法建立HttpWorkerRequest的對象,來保存請求信息(HttpContext的前身),進而調用HttpRuntime的靜態方法ProcessRequestNoDemand而最終在其實例方法(HttpRuntime有一個字段private static HttpRuntime _theRuntime;來保證每一個應用程序只有一個HttpRuntime實例) ProcessRequestInternal裏建立了HttpContext和HttpApplication對象。在向HttpApplicationFactory申請對象時,若對象不是現成的,纔會間接調用HttpApplication的InitialModules方法建立已經配置的module,最後開始走HttpApplication的19個事件,(即管線/Http Pipeline)加工HttpContext。服務器

19個事件中,在PreRequestsHandlerExecute和PostRequestsHandlerExecute兩個事件之間,調用了HttpHandler的ProcessRequest方法。自定義的HttpModule能夠在HttpApplication對象的任意一個事件上註冊方法,HttpApplication則會在順序觸發這19個事件時依次調用在每一個事件上註冊的方法。一般處理請求時,會在PostAcquireRequestState、PreRequestsHandlerExecute這兩個事件上註冊,前者是Session已經得到(前提是HttpHandler實現了IRequiresSessionState接口,Page類是經過EnableSessionState="false"來動態覺定是否實現此接口),後者是將要執行HttpHandler的ProcessRequest方法。app

系統已經註冊的HttpModule、HttpHandler能夠參見C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config文件,咱們能夠看到.config、.cs等文件之因此不能直接訪問,是由於都被註冊了一個HttpForbiddenHandler。在網站根目錄中的web.config註冊的HttpHandler優先級要高於系統已經註冊的,因此若是若是註冊一個HttpHandler,並將path設爲「Account/*.aspx」,那麼全部訪問Account文件夾下的aspx請求都會轉到註冊的HttpHandler上。dom

 

參考:網站

IIS 5.0 和 6.0 的 ASP.NET 應用程序生命週期概述ui

用三張圖片詳解Asp.Net 全生命週期 htm

ASP.NET Process Model之二 對象

ASP.NET內幕 - ISAPI和應用程序域之間的橋樑