ASP.NET狀態管理之三:Application

來源:互聯網
上載者:User
 

一、 全域應用程式類

從Application這個單詞上大致可以看出Application狀態是整個應用程式全域的。在ASP時代我們通常會在Application中儲存一些公用資料,而ASP.NET中Application的基本意義沒有變:在伺服器記憶體中儲存數量較少又獨立於使用者請求的資料。由於它的訪問速度非常快而且只要應用程式不停止,資料一直存在,我們通常在Application_Start的時候去初始化一些資料,在以後的訪問中可以迅速訪問和檢索。

我們可以來實踐一下。首先,按右鍵網站,選擇“添加新項”命令,3-1所示,選擇全域應用程式類。

 

圖3-1 添加一個Global.asax

Global.asax(通常我們不改名)是一個用來處理應用程式全域的事件。開啟檔案,系統已經為我們定義了一些事件的處理方法。

<script runat="server">

    void Application_Start(object sender, EventArgs e)

    {

        // 在應用程式啟動時啟動並執行代碼

    }   

    void Application_End(object sender, EventArgs e)

    {

        // 在應用程式關閉時啟動並執行代碼

    }       

    void Application_Error(object sender, EventArgs e)

    {

        // 在出現未處理的錯誤時啟動並執行代碼

    }

    void Session_Start(object sender, EventArgs e)

    {

        // 在新會話啟動時啟動並執行代碼

    }

    void Session_End(object sender, EventArgs e)

    {

        // 在會話結束時啟動並執行代碼

        // 注意: 只有在 Web.config 檔案中的 sessionstate 模式設定為InProc 時,才會引發 Session_

           End 事件

        // 如果會話模式設定為 StateServer 或 SQLServer,則不會引發該事件

    }

</script>

通過這些注釋我們可以看到,這些事件是整個應用程式的事件,和某一個頁面沒有關係。

 

二、使用 Application統計網站訪問

假設我們希望使用Application統計網站的訪問情況。

·      頁面單擊數。頁面被單擊一次+1,不管是否是同一個使用者多次單擊頁面。

·      使用者訪問數。來了一個使用者+1,一個使用者開啟多個頁面不會影響這個數字。

我們首先需要在Application_Start中去初始化兩個變數。

void Application_Start(object sender, EventArgs e)

{

    // 在應用程式啟動時啟動並執行代碼

    Application["PageClick"]=0;

    Application["UserVisit"]=0;

}

使用者訪問數根據Session來判斷,因此可以在Session_Start的時候去增加這個變數:

void Session_Start(object sender, EventArgs e)

{

    Application.Lock();

    Application["UserVisit"]=(int)Application["UserVisit"]+1;

    Application.UnLock();

}

我們看到,Application的使用方法和Session差不多。唯一要注意的是,Application的作用範圍是整個應用程式,可能有很多使用者在同一個時間訪問Application造成並發混亂,因此在修改Application的時候需要先鎖定Application,修改完成後再解鎖。

頁面單擊數則在頁面Page_Load的時候去修改。

protected void Page_Load(object sender, EventArgs e)

{

    if (!IsPostBack)

    {

        Application.Lock();

        Application["PageClick"] = (int)Application["PageClick"] + 1;

        Application.UnLock();

        Response.Write(string.Format("頁面單擊數:{0}<br/>", Application["PageClick"]));

        Response.Write(string.Format("使用者訪問數:{0}<br/>", Application["UserVisit"]));

    }

}

由於在應用程式開始的時候我們已經為兩個變數初始化了,所以在這裡可以直接使用。首次執行效果3-2所示。

連續重新整理頁面幾次,效果3-3所示。

使用Ctrl+N按鍵組合開啟幾個頁面,可以發現使用者訪問數還是沒有變化。前一節中介紹過,Session是每個用戶端一份,而不是每個瀏覽器一份。

關閉頁面,再重新開啟。由於前一個使用者的Session還沒有逾時,所以這次使用者訪問數增加了1,3-4所示。


圖3-2  使用Application
進行網站統計


圖3-3  頁面單擊數隨著
頁面重新整理增長

圖3-4 Session_Start導致
使用者訪問數增長

 

我們知道,Visual Studio 2005有一個內建的伺服器(不依賴IIS)。因此,我們不能通過IIS來重新啟動應用程式。3-5所示。

單擊“停止”選項,然後重新開啟頁面,3-6所示,我們可以看到兩個變數都重新初始化了。

        

     圖3-5  停止IDE內建的Web伺服器     圖3-6  重新啟動Web伺服器導致Application_Start觸發

 

三、 A pplication總結

在ASP.NET 2.0中,Application已經變得不是非常重要了。因為Application的自我管理功能非常薄弱,它沒有類似Session的逾時機制。也就是說,Application中的資料只有通過手動刪除或者修改才能釋放記憶體,只要應用程式不停止,Application中的內容就不會消失。在下一節中,我們會看到,可以使用Cache實作類別似Application的功能,同時Cache又有豐富而強大的自我管理機制。

在結束本節以前,讓我們來根據第一節中提出的幾個問題總結一下Application的特性。

·      儲存的物理位置。伺服器記憶體。

·      儲存的類型限制。任意類型。

·      狀態使用的範圍。整個應用程式。

·      儲存的大小限制。任意大小。

·      生命週期。應用程式開始的時候建立(準確來說是使用者第一次請求某URL的時候建立),應用程式結束的時候銷毀。

·      安全與效能。資料總是儲存在服務端,安全性比較高,但不易儲存過多資料。

·      優缺點與注意事項。檢索資料速度快,但缺乏自我管理機制,資料不會自動釋放。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.