ASP.NET 状态管理概览
頁面每次被回傳到服務器的時候都會創建 Web 頁面類的一個新實例。在傳統的 Web 開發中,這意味著在每次回傳的過程中,頁面中所有與頁面和控件相關聯的信息都將被丟失。例如,如果用戶在一個文本框中輸入了信息,那么在瀏覽器或者其他客戶端設備與服務器的回傳過程中,文本框中的信息將被丟失。
要克服 Web 開發的這個固有的局限性,ASP.NET 包括了幾個選項來幫助你在單頁面和應用程序中保持數據。這些特征如下所示:
視圖狀態
控件狀態
隱藏字段
Cookies
查詢字符串
應用程序狀態
會話狀態
檔案屬性
視圖狀態、控件狀態、隱藏字段、Cookies、以及查詢字符串包括了在客戶端保存數據的不同方法。但是,應用程序狀態、會話狀態、以及檔案屬性則在服務器的內存中保存數據。每個選項都有各自不同的優勢和缺點,這取決于具體情況而定。
基于客戶端的狀態管理選項
下列部分描述了在頁面或者客戶端計算機中保存信息的狀態管理選項。這些選項在回傳的過程中不需要在服務器中維護任何信息。
視圖狀態
ViewState 屬性提供了一個字典對象來為相同的頁面在多個請求之間保持值。這是頁面在回傳過程之間用來保持頁面和控件屬性值的默認方法。
一旦頁面被處理,頁面和控件的當前狀態就會被混列進一個字符串并且保存成頁面的一個隱藏字段,如果被保存在 ViewState 屬性中的數據個數超出了 MaxPageStateFieldLength 屬性所指定的值,那么頁面中將出現多個隱藏字段。當頁面被回傳到服務器的時候,被回傳的頁面會在初始化并恢復屬性信息的時候對其中的視圖狀態字符串進行處理。
你能夠把值保存到視圖狀態中。關于詳細內容,請參考:[ASP.NET 實踐:在視圖狀態中保存值]。關于應該在何時使用視圖狀態的建議,請參考:[ASP.NET 狀態管理的建議]。
控件狀態
有時候你需要為了控件的正常工作而保存控件的狀態數據。例如,如果你編寫了一個使用不同的制表頁來顯示不同信息的自定義控件,如果要想讓控件能夠正常工作,那么控件就需要在回傳的過程中知道哪個制表頁是被選中的。ViewState 屬性就能夠用于這個目的,但是視圖狀態能夠頁面級別被開發者所關閉,從而破壞了控件的正常功能。要解決這個問題,ASP.NET 頁面框架暴露了一個被稱作控件狀態的 ASP.NET 特征。
ControlState 屬性允許你保持特定控件的屬性信息,并且不會像 ViewState 屬性一樣能夠被關閉。
隱藏字段
ASP.NET 允許你在 HiddenField 控件中保存信息,該控件是作為一個標準的 HTML 隱藏字段而呈現在頁面中的。隱藏字段在瀏覽器中是不可見的,但是你能夠像標準控件一樣來設置它的屬性。當頁面被提交到服務器之后,隱藏字段的內容會連同其他控件一起被發送到 HTTP 窗體集中。隱藏字段為所有需要直接保存到頁面中的特定信息而扮演著貯藏室的角色。
安全提示:惡意用戶很容易就能夠查看到隱藏字段的內容并且進行更改。所以,請不要把任何機密信息或者應用程序正常工作時所必需的信息保存到隱藏字段中。關于更多信息,請參考:[ASSP.NET 狀態管理的建議]。
HiddenField 控件在它的 Value 屬性中保存單個變量并且必須被明確地被添加到頁面中。關于詳細信息,請參考:[HiddenField Web 服務器控件概覽]。
要在頁面處理期間使隱藏字段的值生效,你必須使用 HTTP POST 命令來提交頁面。如果你使用隱藏字段并且頁面是為了響應連接或者 HTTP GET 命令而被處理的,那么隱藏字段將不再有效。關于使用建議,請參考:[ASP.NET 狀態管理的建議]。
Cookies
Cookies 是既能夠保存在客戶端文件系統的文本文件中也能夠保存在客戶端瀏覽器的會話內存中的少量數據。它包含服務器連同頁面輸出一起被發送到客戶端的網站特定信息。Cookies 能夠是臨時性的(通過指定過期時間和日期)也能夠是持久性的。
你能夠使用 Cookies 來保存關于特定的客戶端、會話、或者應用程序的相關信息。Cookies 被保存在客戶端設備中,并且在瀏覽器請求頁面的時候,客戶端會連同請求信息一起發送 Cookies 中的信息。服務器能夠讀取這些 Cookies 并且提取它們的值。Cookies 的一個典型用途就是用來保存指示用戶地否被應用程序所驗證的記號(可能已經被加密)。
安全提示:瀏覽器只能夠把數據回發到最初創建 Cookies 的服務器。但是,惡意用戶也能夠對 Cookies 進行訪問并且讀取它們的內容。所以建議你不要在 Cookies 中保存機密信息(如用戶名稱或者密碼)。而是在 Cookies 中保存識別用戶的記號,然后使用這個記號來查尋服務器上的機密信息。
關于更多使用 Cookies 的信息,請參考:[Cookies]和[ASP.NET 狀態管理的建議]。
查詢字符串
查詢字符串是被添加到頁面 URL 結束部分的信息。典型的查詢字符串看起來可能像下列實例:
http://www.contoso.com/listwidgets.aspx?category=basic&price=100在上面的 URL 路徑中,查詢字符串使用問號(?)作為開始并且包括兩個 Attribute/Value 數據對,一個被命名為 category 而另一個被命名被 price。
查詢字符串為維護狀態信息提供了一個簡單的方法,但是它仍然受到某種程度的限制。例如,它們在從一個頁面到另一個頁面傳遞數據的時候是非常方便的,如從一個頁面中傳遞一個產品編號到另一個將會對該編號進行處理的頁面中。但是,有些瀏覽器和客戶端設備卻限制了 URL 的長度最多不能夠超過 2083 個字符。
安全提示:在查詢字符串中被傳遞的信息能夠被惡意用戶所篡改。請不要在查詢字符串中包含重要數據或機密數據。另外,用戶能夠對 URL 進行標記或者把 URL 發送給其他的用戶,因此查詢字符串也被連同在一起被標記或者被轉發。關于更多信息,請參考:[ASP.NET 狀態管理的建議]和[ASP.NET 實踐:在 Web 應用程序中對字符串進行 HTML 編碼來保護反向腳本開發]。
要在頁面處理期間使查詢字符串的值生效,你必須使用 HTTP GET 命令來提交頁面。也就是說,你不能在頁面回應 HTTP POST 命令的處理過程中獲得查詢串的優勢。關于使用建議,請參考:[ASP.NET 狀態管理的建議]。
基于服務器的狀態管理選項
ASP.NET 為你提供了在服務器上維護狀態信息的多種方式,勝于客戶端的信息保持。使用基于服務器的狀態管理,你能夠減少需要發送給客戶端所保持的狀態信息量,但是它需要在服務器中使用昂貴的資源。下列部分描述了三個基于服務器的狀態管理特征:應用程序狀態、會話狀態、以及檔案屬性。
應用程序狀態
ASP.NET 允許你使用應用程序狀態來保存值,每一個活動的 Web 應用程序中都有一個 HttpApplicationState 類的實例。應用程序狀態是一個全局存儲機制,Web 應用程序中的所有頁面都能夠對其進行訪問。因此,應用程序狀態有助于保存需要在服務器回傳過程之間以及頁面的請求之間所維護的信息。關于更多信息,請參考:[ASP.NET 應用程序狀態概覽]。
應用程序狀態被保存在每個特定 URL 的請求期間所創建的一個 Key/Value 字典中。你能夠把特定的應用程序信息添加到這個結構中,以在頁面請求之間實現共享。
一旦你把特定的應用程序信息保存到應用程序狀態中,服務器就會對它進行管理。關于使用建議,請參考:[ASP.NET 狀態管理的建議]。
會話狀態
ASP.NET 允許你使用會話狀態來保存值,每一個活動的 Web 應用程序會話中都有一個 HttpSessionState 類的實例。關于詳細內容,請參考:[會話狀態概覽]。
會話狀態類似于應用程序狀態,不同之處就是它只適用于當前瀏覽器會話的范圍。如果有不同的用戶在使用應用程序,那么每個用戶會話中都將擁有不同的會話狀態。另外,如果用戶離開了應用程序并且再次回來,第二個用戶會話的會話狀態將完全區別于第一個會話。
會話狀態由一個 Key/Value 字典所組成,用來保存需要在服務器回傳過程之間和頁面的請求之間所維護的特定話信息。關于更多信息,請參考:[會話狀態概覽]。
你能夠使用會話狀態來完成下列任務:
-
單獨識別瀏覽器或客戶端設備的請求并把它們映射到服務器中的單獨會話實例中。
-
為在相同會話中使用跨多個瀏覽器或客戶端設備的請求而在服務器中保存會話的特定數據。
-
引發適當的會話管理事件。另外,你可以編寫應用程序代碼來處理這些事件。
一旦你在會話狀態中添加了特定的應用程序信息之后,服務器就會對該對象進行管理。這取決于你所指定的選項,會話信息能夠被保存進 Cookies、進程外服務器、或者是運行 Microsoft SQL Server 的計算機。關于使用建議,請參考:[ASP.NET 狀態管理的建議]。
檔案屬性
ASP.NET 提供了一個被稱作檔案屬性的特征,允許你保存特定的用戶數據。這個特征與會話狀態類似,不同之處就是檔案數據不會在用戶的會話過期的時候被丟失。檔案屬性特征所使用的 ASP.NET 檔案被保存在一個持續格式中并且與單獨的用戶相關聯。ASP.NET 檔案允許你在不需要創建并維護自定義數據庫的情況下來簡化對用戶信息的管理。另外,檔案還使用一個強類型的 API 使用戶信息能夠生效,你能夠在應用程序的任何位置對這個 API 進行訪問。你能夠在檔案中保存任何類型的對象。ASP.NET 檔案特征提供了一個普通的存儲系統來允許你在仍然需要在類型安全規則中使數據生效的情況下定義并維護幾乎所有類型的數據。
要使用檔案屬性,你必須先配置一個檔案提供者。ASP.NET 包括一個允許你在 SQL 數據庫中保存檔案數據的 SqlProfileProvider 類,但是你同樣能夠創建自定義的檔案提供者類,把檔案數據以自定義的格式保存到一個自定義存儲機制中(如 XML 文件、或者甚至是 Web Services)。
因為保存在檔案屬性中的數據并沒有被保存到應用程序的內存中,所以可以防止在 Internet 信息服務(IIS)被重啟和工作者進程被重啟的時候所造成的數據丟失。另外,檔案屬性還能夠跨多個進程(如 Web 農場或 Web 花園)而被保持。關于更多信息,請參考:[ASP.NET 檔案屬性概覽]。
轉載于:https://www.cnblogs.com/Laeb/archive/2007/01/10/616988.html
總結
以上是生活随笔為你收集整理的ASP.NET 状态管理概览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用拖拉实现设备驱动配置(EsayHMI最
- 下一篇: 禁止自动播放功能