1. 程式人生 > >asp.net mvc global.asax文件詳解

asp.net mvc global.asax文件詳解

cte sharp resolve 起點 intern tco pro 處理程序 light

一、文件概述

  global.asax這個文件包含全局應用程序事件的事件處理程序。它響應應用程序級別和會話級別事件的代碼。  
運行時, Global.asax 將被編譯成一個動態生成的 .NET Framework 類,該類是從HttpApplication基類派生的。
因此在global.asax中的代碼可以訪問HttpApplication類中所有的public或者protected的成員
global.asax不被用戶直接請求,但global.asax中的代碼會被自動執行來響應特定的應用程序事件。
global.asax是可選的,而且在一個web項目中是唯一的,它應該處於網站的根目錄。

二、一個請求的完整過程

以下過程由Internet Information Service(inetinfo.exe)(IIS)執行
1.客戶端發出請求
2.驗證請求
3.給請求授權
4.確定請求的緩存
5.獲取緩存狀態
6.在請求的處理程序執行前
7.http處理程序執行請求 (asp.net頁面由aspnet_wp.exe執行)
8.在請求的處理程序執行後
9.釋放請求狀態
10.更新請求緩存
11.請求結束

三、Global.asax.cs中的事件

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            //不是每次請求都調用
            //在Web應用程序的生命周期裏就執行一次
            //在應用程序第一次啟動和應用程序域創建事被調用
            //適合處理應用程序範圍的初始化代碼
        }

        void Application_End(object sender, EventArgs e)
        {
            //不是每次請求都調用
            //在應用程序關閉時運行的代碼,在最後一個HttpApplication銷毀之後執行
            //比如IIS重啟,文件更新,進程回收導致應用程序轉換到另一個應用程序域
        }

        void Session_Start(object sender, EventArgs e)
        {
            //不是每次請求都調用
            //會話開始時執行
        }

        void Session_End(object sender, EventArgs e)
        {
            //不是每次請求都調用
            //會話結束或過期時執行
            //不管在代碼中顯式的清空Session或者Session超時自動過期,此方法都將被調用
        }

        void Application_Init(object sender, EventArgs e)
        {
            //不是每次請求都調用
            //在每一個HttpApplication實例初始化的時候執行
        }

        void Application_Disposed(object sender, EventArgs e)
        {
            //不是每次請求都調用
            //在應用程序被關閉一段時間之後,在.net垃圾回收器準備回收它占用的內存的時候被調用。
            //在每一個HttpApplication實例被銷毀之前執行
        }

        void Application_Error(object sender, EventArgs e)
        {
            //不是每次請求都調用
            //所有沒有處理的錯誤都會導致這個方法的執行
        }


        /*********************************************************************/
        //每次請求都會按照順序執行以下事件
        /*********************************************************************/

        void Application_BeginRequest(object sender, EventArgs e)
        {
            //每次請求時第一個出發的事件,這個方法第一個執行
        }

        void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            //在執行驗證前發生,這是創建驗證邏輯的起點
        }

        void Application_AuthorizeRequest(object sender, EventArgs e)
        {
            //當安全模塊已經驗證了當前用戶的授權時執行
        }

        void Application_ResolveRequestCache(object sender, EventArgs e)
        {
            //當ASP.NET完成授權事件以使緩存模塊從緩存中為請求提供服務時發生,從而跳過處理程序(頁面或者是WebService)的執行。
            //這樣做可以改善網站的性能,這個事件還可以用來判斷正文是不是從Cache中得到的。
        }

        //------------------------------------------------------------------------
        //在這個時候,請求將被轉交給合適程序。例如:web窗體將被編譯並完成實例化
        //------------------------------------------------------------------------

        void Application_AcquireRequestState(object sender, EventArgs e)
        {
            //讀取了Session所需的特定信息並且在把這些信息填充到Session之前執行
        }

        void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            //在合適的處理程序執行請求前調用
            //這個時候,Session就可以用了
        }

        //-------------------------------------------------
        //在這個時候,頁面代碼將會被執行,頁面呈現為HTML
        //-------------------------------------------------

        void Application_PostRequestHandlerExecute(object sender, EventArgs e)
        {
            //當處理程序完成對請求的處理後被調用。
        }

        void Application_ReleaseRequestState(object sender, EventArgs e)
        {
            //釋放請求狀態
        }

        void Application_UpdateRequestCache(object sender, EventArgs e)
        {
            //為了後續的請求,更新響應緩存時被調用
        }

        void Application_EndRequest(object sender, EventArgs e)
        {
            //EndRequest是在響應Request時最後一個觸發的事件
            //但在對象被釋放或者從新建立以前,適合在這個時候清理代碼
        }

        void Application_PreSendRequestHeaders(object sender, EventArgs e)
        {
            //向客戶端發送Http標頭之前被調用
        }

        void Application_PreSendRequestContent(object sender, EventArgs e)
        {
            //向客戶端發送Http正文之前被調用
        }
    }

  

asp.net mvc global.asax文件詳解