狀態管理是您對同一頁或不同頁的多個請求維護狀態和頁資訊的過程。與所有基於 HTTP 的技術一樣,Web Form頁是無狀態的,這意味著它們不自動指示序列中的請求是否全部來自相同的用戶端,或者單個瀏覽器執行個體是否一直在查看頁或網站。此外,到伺服器的每一往返過程都將損壞並重新建立頁;因此,如果超出了單個頁的生命週期,頁資訊將不存在。有關伺服器往返過程和 Web Form頁生命週期的更多資訊,請參見 Web Form頁處理。
ASP.NET 提供多種方式來在伺服器往返過程之間維護狀態。對 ASP.NET 中所提供的狀態管理選項的選擇將主要取決於您的應用程式,並且應基於以下條件:
- 需要儲存的資訊量有多大?
- 用戶端是接受持久性的還是記憶體中的 Cookie?
- 是要在用戶端還是在伺服器上儲存資訊?
- 資訊是否是敏感資訊?
- 您對應用程式設定了什麼樣的效能條件?
ASP.NET 支援用於狀態管理的各種用戶端和伺服器端選項。
用戶端選項有:
- ViewState 屬性
- 隱藏欄位
- Cookie
- 查詢字串
伺服器端選項有:
用戶端狀態管理選項
使用用戶端選項儲存頁資訊不使用伺服器資源。這些選項往往具有最低的安全性但具有最快的伺服器效能,因為對伺服器資源的要求是適度的。但是,由於必須將資訊發送到用戶端來進行儲存,因此對於以這種方式可以儲存多少資訊存在一定的客觀限制。
檢視狀態
Web Form頁提供 ViewState 屬性作為內建結構,在對同一頁的多個請求間自動保留值。檢視狀態作為頁中的隱藏欄位來進行維護。有關更多資訊,請參見 Web Form狀態管理介紹。
可以使用檢視狀態在頁回傳到自身時跨越往返過程儲存您自己的頁特定值。例如,如果您的應用程式正在維護使用者特定的資訊(即,該資訊在頁上使用,但不是任何控制項所必需的部分),則可以使用檢視狀態儲存該資訊。
使用檢視狀態的優點是:
- 不需要任何伺服器資源。檢視狀態包含在頁代碼內的結構中。
- 簡單的實現。
- 頁和控制項狀態的自動保持。
- 增強安全功能。檢視狀態中的值是散列的、壓縮的並且是為 Unicode 實現而編碼的,這意味著比隱藏欄位具有更高的安全性狀態。
使用檢視狀態的缺點是:
- 效能。由於檢視狀態儲存在頁本身,因此如果儲存較大的值,在使用者顯示頁和發送頁時,頁的速度就可能會減慢。
- 安全性。檢視狀態儲存在頁上的隱藏欄位中。雖然檢視狀態以雜湊格式儲存資料,但它可以被篡改。如果直接查看頁輸出源,可以看到隱藏欄位中的資訊,這導致潛在的安全性問題。有關更多資訊,請參見介紹 Web 應用程式安全性。
有關使用檢視狀態的更多資訊,請參見使用檢視狀態儲存 Web Form頁值。
隱藏欄位
可以在頁上的隱藏欄位中儲存特定於頁的資訊,作為維護頁的狀態的一種方式。有關隱藏欄位的更多資訊,請參見 Web Form狀態管理介紹。
如果使用隱藏欄位,最好在用戶端上只儲存少量經常更改的資料。ASP.NET 提供 HtmlInputHidden 控制項,該控制項提供隱藏欄位功能。有關 HtmlInputHidden 的更多資訊,請參見按功能列出的 ASP.NET 伺服器控制項。
注意 如果使用隱藏欄位,則必須使用 HTTP POST 方法向伺服器提交頁,而不是使用通過頁 URL 請求該頁的方法(HTTP GET 方法)向伺服器提交頁。
使用隱藏欄位的優點是:
- 不需要任何伺服器資源。隱藏欄位在頁上儲存並讀取。
- 廣泛的支援。幾乎所有瀏覽器和用戶端裝置都支援具有隱藏欄位的表單。
- 簡單的實現。
使用隱藏欄位的缺點是:
- 安全性。隱藏欄位可以被篡改。如果直接查看頁輸出源,可以看到隱藏欄位中的資訊,這導致潛在的安全性問題。有關更多資訊,請參見介紹 Web 應用程式安全性。
- 有限的儲存結構。隱藏欄位不支援豐富的結構。隱藏欄位提供在其中放置資訊的單範圍。若要儲存多個值,必須實現分隔的字串以及用來分析那些字串的代碼。
- 效能。由於隱藏欄位儲存在頁本身,因此如果儲存較大的值,在使用者顯示頁和發送頁時,頁的速度就可能會減慢。
Cookie
Cookie 用於在用戶端上儲存少量經常更改的資訊。這些資訊與請求一起發送到伺服器。
使用 Cookie 的優點是:
- 不需要任何伺服器資源。Cookie 儲存在用戶端並在發送後由伺服器讀取。
- 簡單。Cookie 是具有簡單索引值對的輕量的、基於文本的結構。
- 可配置到期時間。Cookie 可以在瀏覽器會話結束時到期,或者可以在用戶端電腦上無限期存在,這取決於用戶端的到期規則。
使用 Cookie 的缺點是:
- 大小受到限制。大多數瀏覽器對 Cookie 的大小有 4096 位元組的限制,儘管在當今新的瀏覽器和用戶端裝置版本中,支援 8192 位元組的 Cookie 大小已愈發常見。
- 使用者配置為拒絕接受。有些使用者禁用了瀏覽器或用戶端裝置接收 Cookie 的能力,因此限制了這一功能。
- 安全性。Cookie 可能會受到篡改。使用者可能會操縱其電腦上的 Cookie,這可能意味著安全性會受到影響或者導致依賴於 Cookie 的應用程式失敗。有關更多資訊,請參見介紹 Web 應用程式安全性。
- 持久性。用戶端電腦上 Cookie 的持久性受到用戶端 Cookie 到期進程以及使用者幹預的制約。
注意 Cookie 通常用於為已知使用者自訂內容的個人化情況。在大多數此類情況中,Cookie 是作為“標識”而不是“身分識別驗證”,所以在 Cookie 中只儲存使用者名稱、賬戶名或唯一使用者識別碼(例如 GUID)並使用它來訪問網站的使用者個人化結構是足夠的了。
有關建立和讀取 Cookie 的詳細資料,請參見 和。
查詢字串
查詢字串是附加到頁的 URL 末尾的資訊。有關更多資訊,請參見 Web Form狀態管理介紹。
可以使用查詢字串來通過 URL 將資料提交回您的頁或另一頁上。查詢字串提供一種維護某些狀態資訊的簡單但有限的方法。例如,它們是將資訊從一頁傳送到另一頁的簡便的方法(例如,將產品號傳遞到將處理該產品號的另一頁)。
注意 只有在通過其 URL 請求頁時查詢字串才是可行的選擇。不能從已提交給伺服器的頁讀取查詢字串。
使用查詢字串的優點是:
- 不需要任何伺服器資源。查詢字串包含在對特定 URL 的 HTTP 要求中。
- 廣泛的支援。幾乎所有瀏覽器和用戶端裝置均支援傳遞查詢字串中的值。
- 簡單的實現。ASP.NET 完全支援查詢字串方法,包括使用 屬性讀取查詢字串的方法。
使用查詢字串的缺點是:
- 安全性。使用者可以通過瀏覽器使用者介面直接看到查詢字串中的資訊。查詢值通過 URL 向 Internet 公開,因此在某些情況下安全性可能成問題。有關更多資訊,請參見介紹 Web 應用程式安全性。
- 有限的容量。大多數瀏覽器和用戶端裝置對 URL 長度有 255 個字元的限制。
用戶端方法狀態管理摘要
下表總結了用戶端狀態管理選項和使用這些選項的場合。
方法 |
使用場合 |
檢視狀態 |
需要為將回傳到自身的頁儲存少量資訊。ViewState 屬性的使用將提供具有基本安全性的功能。 |
隱藏欄位 |
需要為將回傳到自身或另一頁的頁儲存少量資訊,並且不需要較高的安全性。
注意 只能在提交到伺服器的頁上使用隱藏欄位。
|
Cookie |
需要在用戶端儲存少量資訊並且不需要較高的安全性。 |
查詢字串 |
可以將少量資訊從一頁傳輸到另一頁,並且不需要較高的安全性。
注意 只有在請求同一頁,或通過連結請求另一頁時,才能使用查詢字串。
|
伺服器端狀態管理選項
儲存頁資訊的伺服器端選項往往比用戶端選項具有更高的安全性,但它們可能使用更多的 Web 服務器資源,這可能在資訊儲存量較大時導致可縮放性問題。ASP.NET 提供幾種選項來實現伺服器端狀態管理。有關更多資訊,請參見 Web Form狀態管理介紹。
應用程式狀態
ASP.NET 通過 類將應用程式狀態提供為一種儲存全域應用程式特定資訊(對於整個應用程式都可見)的方法。應用程式狀態變數實際上是 ASP.NET 應用程式的全域變數。有關更多資訊,請參見。
您可以在應用程式狀態中儲存應用程式特定的值,應用程式狀態將由伺服器來管理。有關更多資訊,請參見 Web Form狀態管理介紹。
插入到應用程式狀態變數的理想資料是那些由多個會話共用並且不經常更改的資料。
注意 如果以應用程式狀態儲存資料集,則必須將其從 Object 強制轉換回資料集。有關詳細資料,請參見 Web 資料存取原則建議。
使用應用程式狀態的優點是:
- 易於實現。應用程式狀態便於使用,為 ASP 開發人員所熟悉,並且與其他 .NET Framework 類一致。
- 全域範圍。由於應用程式狀態可供應用程式中的所有頁來訪問,因此在應用程式狀態中儲存資訊可能意味著僅保留資訊的一個副本(例如,相對於在工作階段狀態或在單獨頁中儲存資訊的多個副本)。
使用應用程式狀態的缺點是:
- 全域範圍。應用程式狀態的全域性可能也是一項缺點。在應用程式狀態中儲存的變數僅對於該應用程式正在其中啟動並執行特定進程而言是全域的,並且每一應用程式進程可能具有不同的值。因此,不能依賴應用程式狀態來儲存唯一值或更新網路園和網路場配置中的全域計數器。
- 持久性。因為在應用程式狀態中儲存的全域資料是易失的,所以如果包含這些資料的 Web 服務器進程被損壞(最有可能是因伺服器崩潰、升級或關閉而損壞),將丟失這些資料。
- 資源要求。應用程式狀態需要伺服器記憶體,這可能會影響伺服器的效能以及應用程式的可縮放性。
應用程式狀態的精心設計和實現可以提高 Web 應用程式效能。例如,如果將常用的、相關的待用資料集放置到應用程式狀態中,則可以通過減少對資料庫的資料請求總數來提高網站效能。但是,這裡存在一種效能平衡。當伺服器負載增加時,包含大塊資訊的應用程式狀態變數就會降低 Web 服務器的效能。在移除或替換值之前,將不釋放在應用程式狀態中儲存的變數所佔用的記憶體。因此,最好只將應用程式狀態變數用於更改不頻繁的小型資料集。有關最佳化 ASP.NET Web 應用程式的更多資訊,請參見。
工作階段狀態
ASP.NET 提供了一種工作階段狀態,該工作階段狀態可作為 類或儲存會話特定資訊(僅在該會話中可見)的方法來使用。有關更多資訊,請參見 Web Form狀態管理介紹和。
可以在工作階段狀態中儲存會話特定的值和對象,該工作階段狀態對象將由伺服器來進行管理並可用於瀏覽器或用戶端裝置。儲存在工作階段狀態變數中的理想資料是特定於單獨會話的短期的、敏感的資料。
注意 如果以應用程式狀態儲存資料集,則必須將其從 Object 強制轉換回資料集。請參見 Web 資料存取原則建議。
使用工作階段狀態的優點是:
- 易於實現。工作階段狀態功能便於使用,為 ASP 開發人員所熟悉,並且與其他 .NET Framework 類一致。
- 會話特定的事件。會話管理事件可以由應用程式引發和使用。
- 持久性。放置於工作階段狀態變數中的資料可以經受得住 Internet 資訊服務 (IIS) 重新啟動和輔助進程重新啟動,而不丟失會話資料,這是因為這些資料存放區在另一個進程空間中。
- 平台可縮放性。工作階段狀態對象可在多電腦和多進程配置中使用,因而最佳化了可縮放性方案。
- 儘管工作階段狀態最常見的用途是與 Cookie 一起向 Web 應用程式提供使用者標識功能,但工作階段狀態可用於不支援 HTTP Cookie 的瀏覽器。有關獨立於 Cookie 使用工作階段狀態的更多資訊,請參見。
有關更多資訊,請參見。
使用工作階段狀態的缺點是:
- 效能。工作階段狀態變數在被移除或替換前保留在記憶體中,因而可能降低伺服器效能。如果工作階段狀態變數包含類似大型資料集的資訊塊,則可能會因伺服器負荷的增加影響 Web 服務器的效能。
資料庫支援
在某些情況中,您可能希望使用資料庫支援來維護 Web 網站上的狀態。通常,資料庫支援與 Cookie 或工作階段狀態結合在一起使用。例如,對於電子商務 Web 網站,出於以下原因使用關聯式資料庫維護狀態資訊十分普遍:
下面是支援 Cookie 的資料庫 Web 網站的常見功能:
- 安全性。訪問者將賬戶名稱和密碼鍵入到網站登入頁中。網站結構通過登入值查詢資料庫以確定該使用者是否有權使用您的網站。如果資料庫確認該使用者資訊有效,Web 網站將把包含該使用者的唯一 ID 的有效 Cookie 分發到用戶端電腦上。網站授予該使用者存取權限。
- 個人化。通過在適當位置的安全資訊,您的網站能夠藉助讀取用戶端電腦上的 Cookie,區分網站上的每一使用者。通常,網站在資料庫中具有資訊,描述使用者的喜好設定(由唯一 ID 標識)。此關係通稱作個人化。網站可以使用在 Cookie 中包含的唯一 ID 調查使用者的喜好設定,然後向使用者提供與使用者的特定願望相關並在一段時間內對使用者喜好設定作出反應的內容和資訊。
- 一致性。如果您已建立了一個商業 Web 網站,您可能想要為網站上的貨物和服務保留所進行的購買的交易記錄。這些資訊可被可靠地儲存在您的資料庫中並通過使用者的唯一 ID 來引用。它可用於確定購買交易是否完成,還可確定如果購買交易失敗所應採取的操作的過程。這些資訊還可用於通知使用者使用您的網站所下的訂單的狀態。
- 資料採礦。有關網站使用、訪問者或產品交易的資訊可以可靠地儲存在資料庫中。例如,業務發展部門可能希望使用從該網站收集的這些資料確定下一年的產品線或分銷策略。市場營銷部門可能希望查看有關您的網站的使用者的人口統計學資訊。設計和支援部門可能希望查看交易並記下購買過程可以改進的地區。諸如 Microsoft SQL Server 之類的大多數企業級關聯式資料庫為大多數資料採礦項目包含可擴充的工具集。
在上述方案中通過將 Web 網站設計為在每一一般性階段使用唯一 ID 重複查詢該資料庫,該網站對狀態進行維護。在此方法中,使用者感受到網站正記住和響應其本人。
使用資料庫來維護狀態的優點是:
- 安全性。對資料庫的訪問要求嚴格的身分識別驗證和授權,這種訪問通常非常安全。
- 容量。可以根據需要在資料庫中儲存儘可能多的資訊。
- 持久性。可以根據需要在儘可能長的時間記憶體儲資料庫資訊,這些資訊不受 Web 服務器可用性的影響。
- 可靠性和資料完整性。資料庫包括多種用於維護有效功能,其中包括觸發器和參考完整性、事務等。通過在資料庫中(而不是在工作階段狀態等對象中)儲存有關事務的資訊,可以更為方便地從錯誤恢複。
- 可訪問性。儲存在資料庫中的資料可供多種資訊處理工具訪問。
- 廣泛支援。有大量資料庫工具可供使用,並且有許多自訂配置可供使用。
使用資料庫來維護狀態的缺點是:
- 複雜性。使用資料庫支援狀態管理意味著更複雜的硬體和軟體配置。
- 效能。不佳的關係資料模型結構可能導致擴充問題。此外,對資料庫執行過多的查詢可能會影響伺服器效能。
伺服器端方法狀態管理摘要
下表總結了伺服器端狀態管理選項和使用這些選項的場合。
方法 |
使用場合 |
應用程式狀態 |
您是在儲存更改不頻繁的全域資訊,這些資訊由多個使用者使用,此時安全性不成為問題。不要在應用程式狀態中儲存大量的資訊。 |
工作階段狀態 |
儲存特定於單獨會話的短期資訊,並且需要較高的安全性。不要在工作階段狀態中儲存大量的資訊。知道將為應用程式中每一會話的生存期建立和維護工作階段狀態對象。在支援許多使用者的應用程式中,這可能會佔用大量伺服器資源並影響可縮放性。 |
資料庫支援 |
儲存大量資訊,管理交易,或者資訊必須可以經受得住應用程式和會話重新啟動。資料採礦十分重要,並且需要較高的安全性。 |
請參見
Web Form狀態管理 | Web Form狀態管理介紹 | Web Form編程 | 狀態管理建議 | 使用檢視狀態儲存 Web Form頁值 |