清清楚楚asp.net ( 五 ) : global.asax與應用程式全域事件

來源:互聯網
上載者:User

global.asax檔案概述

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中的事件

global.asax中的所有事件可以分成兩種,一種是滿足特定事件時才會被觸發,一種是每次請求都會被按照順序執行的事件。

下面是一個例子,包含了global.asax中包含的所有事件。

代碼<%@ Application Language="C#" %>

<script runat="server">
    
    /*********************************************************************/
    //以下事件不會在每一次請求的時候都會被調用,只會在特定的事情發生的時候被調用
     /*********************************************************************/
    
    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本文之前被調用
    }
   
</script>

清清楚楚asp.net系列學習部落格目錄 

 

參考資料:Pro ASP.NET 3.5 in C# 2008

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.