共用方式為


ASP.NET 應用程式狀態概觀

更新:2007 年 11 月

應用程式狀態是 ASP.NET 應用程式中所有類別都能使用的資料儲存機制。應用程式狀態是儲存在伺服器的記憶體中,並且速度比在資料庫中儲存和擷取資訊還快。工作階段狀態是指特定的單一使用者工作階段,而應用程式狀態與工作階段不同,是適用於所有使用者和工作階段。因此,應用程式狀態是很有用的位置,可用來存放少量經常使用但不會因使用者不同而變更的資料。如需以個別使用者基礎儲存資料的資訊,請參閱ASP.NET 工作階段狀態概觀ASP.NET 設定檔屬性概觀

使用應用程式狀態

應用程式狀態會儲存在 HttpApplicationState 類別的執行個體中。這個類別會公開物件的索引鍵值字典。

HttpApplicationState 執行個體會在使用者第一次存取應用程式中任何 URL 資源時建立。HttpApplicationState 類別最常透過 HttpContext 類別的 Application 屬性進行存取。

應用程式狀態有下列二種使用方式:您可以經由程式碼直接從 Contents 集合加入、存取或移除值。您可以在應用程式存留期間隨時存取 HttpApplicationState 類別。然而,通常在應用程式啟動時載入應用程式狀態資料是很有用的。若要執行這個動作,您可以置入程式碼以便將應用程式狀態載入 Global.asax 檔的 Application_Start 方法中。如需詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀

此外,您也可以在 Web 應用程式的 Global.asax 檔中,經由 <object > 宣告將物件加入 StaticObjects 集合。以這種方式定義的應用程式狀態,可以從應用程式中任意處的程式碼存取。下列程式碼範例,示範了應用程式狀態值的物件宣告:

<object  scope="application" ID="MyInfo" 
    PROGID="MSWC.MYINFO">
</object>

您只能夠在 Global.asax 檔中將物件加入 StaticObjects 集合。如果您嘗試透過程式碼直接加入物件,集合會擲回 NotSupportedException

您可以在不需參考 Application 集合的情況下,存取儲存在應用程式狀態中的物件成員。下列程式碼範例,示範了如何參考應用程式狀態之 StaticObjects 集合中所定義的物件成員:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Label1.Text = MyInfo.Title
End Sub
protected void Page_Load(Object sender, EventArgs e)
    Label1.Text = MyInfo.Title;
End Sub

應用程式狀態考量

當使用應用程式狀態時,您必須留意下列重要考量:

  • 資源:因為是儲存在記憶體中,所以應用程式狀態與儲存在磁碟或資料庫中的資料相比就非常快。然而,在應用程式狀態中儲存大量資料區塊可能會填滿伺服器記憶體,導致伺服器將記憶體分頁至磁碟。另一個使用應用程式狀態的替代方法是,您可以使用 ASP.NET 快取機制以便儲存大量的應用程式資料。ASP.NET 快取也會將資料儲存在記憶體中,所以速度非常快。然而,ASP.NET 會主動管理快取並且在記憶體不足時移除項目。如需詳細資訊,請參閱 ASP.NET 快取概觀

  • 變動性:因為應用程式狀態是儲存在伺服器記憶體中,所以在應用程式停止或重新啟動時就會遺失。例如,如果 Web.config 檔已變更,除非應用程式狀態值已寫入非變動性的存放媒體 (例如資料庫),否則應用程式就會重新啟動並且遺失所有的應用程式狀態。

  • 延展性:應用程式狀態不會在服務相同應用程式的多個伺服器之間共用 (例如 Web 伺服陣列),也不會在相同伺服器上服務相同應用程式的多個背景工作處理序之間共用 (例如 Web 處理序區)。因此您的應用程式無法依賴應用程式狀態,橫跨不同伺服器或處理序以包含應用程式狀態的相同資料。如果應用程式會在多處理器或多伺服器環境中執行,請考慮使用更能夠擴充的選項 (例如資料庫),儲存必須跨應用程式保持精確的資料。

  • 並行:應用程式狀態是無限制執行緒的,表示多個執行緒可以同時存取應用程式狀態資料。因此,確認當您更新應用程式狀態資料時,藉由包含內建同步處理支援,以使用安全執行緒執行這項動作是很重要的。您可以使用 LockUnLock 方法,藉由鎖定資料一次只讓一個來源寫入,以便確認資料完整性。您也可以在 Global.asax 檔的 Application_Start 方法中初始化應用程式狀態值,減少並行問題的可能性。如需詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀

請參閱

工作

HOW TO:儲存應用程式狀態的值

HOW TO:讀取應用程式狀態的值

概念

ASP.NET 狀態管理概觀

其他資源

ASP.NET 狀態管理的新功能