ASP.NET 狀態管理概觀
更新:2007 年 11 月
每次網頁發佈至伺服器時,都會建立新的 Web 網頁類別執行個體。在傳統的 Web 程式設計中,這通常意味著與網頁關聯的所有資訊以及網頁上的控制項,會在每次來回往返時遺失。例如,如果使用者在某個文字方塊中輸入了一些資訊,這些資訊將會在瀏覽器或用戶端裝置到伺服器的來回往返中遺失。
為了克服這項傳統 Web 程式設計的既有限制,ASP.NET 包含數種選項,幫助您同時以每頁為基礎和以整個應用程式為基礎的方式保留資料。這些功能如下所示:
檢視狀態
控制項狀態
隱藏欄位
Cookie
查詢字串
應用程式狀態
工作階段狀態
設定檔屬性
檢視狀態、控制項狀態、隱藏欄位、Cookie 和查詢字串都會以不同的方式將資料儲存在用戶端上。然而,應用程式狀態、工作階段狀態和設定檔屬性都會將資料儲存在伺服器的記憶體中。每個選項會因實際情況而不同的優缺點。
用戶端架構的狀態管理選項
以下的章節會描述關於在網頁或用戶端電腦上儲存資訊的狀態管理選項。這些選項不會在來回往返之間於伺服器上維持任何資訊。
檢視狀態
ViewState 屬性提供 Dictionary 物件來保留對相同網頁的多個要求之間的值。這是網頁用來在來回往返之間保留網頁和控制項屬性值的預設方法。
處理網頁時,網頁目前的狀態和控制項會雜湊至字串中,並且儲存在網頁中當做一個隱藏欄位,或是如果儲存在 ViewState 屬性的資料量超過 MaxPageStateFieldLength 屬性中指定的值時,則會當做多個隱藏欄位。網頁回傳到伺服器時,網頁會在網頁初始化時剖析檢視狀態字串,並且還原網頁中的屬性資訊。
您也可以將一些值儲存在檢視狀態中。如需使用檢視狀態的詳細資訊,請參閱 ASP.NET 檢視狀態概觀。如需使用檢視狀態時機的建議,請參閱 ASP.NET 狀態管理建議事項。
控制項狀態
有時候為了讓控制項能夠正常運作,您需要儲存控制項狀態資料。例如,如果您撰寫擁有可以顯示不同資訊之索引標籤的自訂控制項,為了讓該控制項如預期般發揮作用,控制項需要知道在來回往返之間所選取的索引標籤。ViewState 屬性可以達到這項用途,但是開發人員可以在頁面層次關閉檢視狀態,就會有效中斷您的控制項。若要解決這個問題,ASP.NET 網頁架構公開 (Expose) 一項 ASP.NET 中的功能,稱為控制項狀態。
ControlState 屬性可讓您保存特定控制項的屬性資訊,並且無法像 ViewState 屬性一樣被關閉。
隱藏欄位
ASP.NET 可以讓您將資訊儲存在 HiddenField 控制項中,並以標準 HTML 隱藏欄位呈現。隱藏欄位在瀏覽器中不會以可見的方式呈現,但是您可以設定它的屬性,就像是設定標準控制項一樣。當網頁被送出到伺服器時,隱藏欄位的內容會與其他控制項的值一起在 HTTP Form 集合中傳送。隱藏欄位就像是一種儲存機制,讓您儲存想要直接儲存在網頁中的任何網頁特定資訊。
安全性注意事項: |
---|
惡意使用者很輕易就能看見並修改隱藏欄位的內容。請勿將任何機密或是應用程式仰賴得以正常運作的資訊存放在隱藏欄位中。如需詳細資訊,請參閱 ASP.NET 狀態管理建議事項。 |
HiddenField 控制項會在 Value 屬性中儲存單一變數,而且必須明確地加入至網頁。如需詳細資訊,請參閱 HiddenField Web 伺服器控制項概觀。
若要讓隱藏欄位值在網頁處理時能夠使用,您必須使用 HTTP Post 命令送出網頁。如果您使用隱藏欄位,並且以回應連結或 HTTP GET 命令來處理網頁,則會無法使用隱藏欄位。如需使用上的建議,請參閱 ASP.NET 狀態管理建議事項。
Cookie
Cookie 是儲存在用戶端檔案系統的文字檔中,或是用戶端瀏覽器工作階段內記憶體中的少量資料。它包含伺服器隨著網頁輸出一起傳送至用戶端的網站特定資訊。Cookie 可以是暫時性的 (有特定的到期時間和日期),也可以是永續性 (Persistent) 的。
您可以使用 Cookie 來儲存特定用戶端、工作階段或應用程式的相關資訊。Cookie 儲存在用戶端裝置上,當瀏覽器要求網頁時,用戶端會將 Cookie 中的資訊以及要求的資訊一起傳送。伺服器可以讀取 Cookie 並且擷取它的值。最常見的運用是用來儲存語彙基元 (可能是加密的),表示該使用者已經在您的應用程式中驗證過了。
安全性注意事項: |
---|
瀏覽器只能將資料傳回原來建立 Cookie 的伺服器。然而,惡意使用者有辨法存取 Cookie 並且讀取其內容。建議您不要將敏感資訊儲存在 Cookie 中,如使用者名稱或密碼。而是將識別使用者的語彙基元儲存在 Cookie 中,然後使用語彙基元查詢伺服器上的敏感資訊。 |
如需使用 Cookie 的詳細資訊,請參閱 Cookies 和 ASP.NET 狀態管理建議事項。
查詢字串
查詢字串是附加在網頁 URL 結尾的資訊。典型的查詢字串範例大略如下:
https://www.contoso.com/listwidgets.aspx?category=basic&price=100
在上述的 URL 路徑中,查詢字串是以問號 (?) 為開頭,並且包含了兩個屬性/值組,一個名為 "category",另一個為 "price"。
查詢字串提供簡單但功能受限的方式來維護狀態資訊。例如,它們可以很輕易地將資訊從一個網頁傳遞到另一個網頁 (例如從某個網頁將產品編號傳遞到另一個處理這些編號的網頁)。但是,某些瀏覽器和用戶端裝置對於 URL 的長度都有 2083 個字元的限制。
安全性注意事項: |
---|
在查詢字串中傳遞的資訊,可能會遭到惡意使用者的竄改。請勿依賴查詢字串傳遞重要或機密的資料。此外,使用者可以將 URL 標記為書籤或是將 URL 傳送給其他使用者,使得該資訊一起傳送。如需詳細資訊,請參閱 ASP.NET 狀態管理建議事項和 HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊。 |
若要讓查詢字串能在網頁處理時使用,您必須使用 HTTP Get 方法送出網頁。也就是說,如果網頁是以回應 HTTP Post 命令的方法處理,您就不能利用查詢字串。如需使用上的建議,請參閱 ASP.NET 狀態管理建議事項。
伺服器端狀態管理選項
ASP.NET 提供各種方式讓您維護伺服器上的狀態資訊,而不是在用戶端上保存資訊。使用伺服器端狀態管理時,您可以減少傳送給用戶端的資訊量以便保留狀態,但是可能會使用很多伺服器資源。下列章節描述三種伺服器端狀態管理功能:應用程式狀態、工作階段狀態和設定檔屬性。
應用程式狀態
ASP.NET 允許您使用應用程式狀態 (為 HttpApplicationState 類別的執行個體) 儲存每個作用中 Web 應用程式的值。應用程式狀態是全域儲存機制,Web 應用程式中的所有頁面都能夠存取。因此,對於需要在伺服器來回往返之間以及網頁要求之間維護的資訊,應用程式狀態是儲存這些資訊的好方法。如需詳細資訊,請參閱 ASP.NET 應用程式狀態概觀。
應用程式狀態是儲存在每次要求特定 URL 期間建立的索引鍵/值字典中。您可以將您的應用程式專屬資訊加入至此結構,以便在網頁要求之間儲存。
一旦將您的應用程式專屬資訊加入至應用程式狀態之後,伺服器就可以管理它了。如需使用上的建議,請參閱 ASP.NET 狀態管理建議事項。
工作階段狀態
ASP.NET 允許您使用工作階段狀態 (為 HttpSessionState 類別的執行個體) 儲存每個作用中 Web 應用程式工作階段的值。如需概觀說明,請參閱 ASP.NET 工作階段狀態概觀。
工作階段狀態與應用程式狀態類似,不同之處在於它的範圍僅限於目前的瀏覽器工作階段。如果不同的使用者使用您的應用程式,每個使用者工作階段都有不同的工作階段狀態。此外,如果同一位使用者離開了您的應用程式但稍後又回來,則第二個使用者工作階段與第一個的工作階段狀態並不相同。
工作階段狀態是索引鍵/值字典的結構,用來存放需要在伺服器來回往返之間和網頁要求之間維護的工作階段特定資訊。如需詳細資訊,請參閱 ASP.NET 工作階段狀態概觀。
您可以使用工作階段狀態完成下列工作:
明確地識別瀏覽器或用戶端裝置要求,並且將它們對應到伺服器上的個別工作階段執行個體。
在伺服器上儲存工作階段專屬資料,供同一工作階段中的多個瀏覽器或用戶端裝置要求使用。
引發適當的工作階段管理事件。此外,您還可以撰寫使用這些事件的應用程式程式碼。
一旦將您的應用程式專屬資訊加入至工作階段狀態之後,伺服器就可以管理這個物件了。視您指定的選項而定,工作階段資訊可以儲存在 Cookie、跨處理序 (Out-Of-Process) 伺服器或執行 Microsoft SQL Server 的電腦中。如需使用上的建議,請參閱 ASP.NET 狀態管理建議事項。
設定檔屬性
ASP.NET 提供稱為設定檔屬性的功能,可以讓您儲存使用者相關的資料。這項功能與工作階段狀態類似,不同之處在於當使用者工作階段過期時,設定檔資料不會遺失。設定檔屬性功能會使用 ASP.NET 設定檔,其使用永續性格式儲存並且與個別使用者相關聯。ASP.NET 設定檔可讓您輕易地管理使用者資訊,而不需要建立和維護您的資料庫。此外,設定檔使用強型別 (Strongly Typed) API 將使用者資訊成為可用,您可以在應用程式中的任何地方存取這些 API。您可以在設定檔中儲存任何型別的物件。ASP.NET 設定檔功能提供泛型的儲存系統,讓您定義和維護幾乎任何種類的資料,但是資料仍然可以用型別安全的方式使用。
若要使用設定檔屬性,您必須設定設定檔提供者。ASP.NET 包含一個 SqlProfileProvider 類別,可讓您將設定檔資料儲存在 SQL 資料庫中,但是您也可以建立自己的設定檔提供者類別,將設定檔資料以自訂格式儲存 (如 XML 檔案),以及儲存至自訂儲存機制 (如 Web 服務)。
因為設定檔屬性中的資料並不會儲存在應用程式的記憶體中,所以在網際網路資訊服務 (IIS) 和背景工作處理序重新啟動時,能夠保留下來而不會遺失資料。此外,設定檔屬性可以橫跨 Web 伺服陣列或 Web 處理序區中的多個處理序而保留下來。如需詳細資訊,請參閱 ASP.NET 設定檔屬性概觀。