HTTP 是無狀態協定,ASP.NET 透過 ViewState(視圖狀態) 讓頁面與控制項在往返之間保持狀態。本文詳細說明 ViewState 運作機制、支援型別、效能與安全考量、以及 ASP.NET 2.0 新增的分塊功能。
每當使用者請求 .aspx 頁面,.NET 框架將相關控制項的狀態資料序列化為字串,存放於名為 __VIEWSTATE 的隱藏欄位中隨頁面輸出至瀏覽器。首次請求時通常為空或預設值;回傳時則包含前一次回傳的屬性狀態,使控制項能還原先前狀態。此過程由框架自動處理,開發者無感知。
ViewState 內建優化序列化的型別包括:String、Int32、Boolean、Color、Array、ArrayList、Hashtable 以及實作 TypeConverter 的自訂型別。使用這些型別可獲得最佳效能;若儲存複雜物件,框架會退回二進位序列化,耗費資源較大。
EnableViewState="false" 關閉。ViewState 以 Base64 編碼明文傳輸,若含敏感資料(密碼、連線字串)有洩漏風險。ASP.NET 提供兩層防護:
EnableViewStateMac="true"(預設開啟),框架以 SHA1(或透過 <machineKey validation="MD5" /> 改用 MD5)產生雜湊碼附加於 ViewState,回傳時驗證完整性。machine.config 設定 <machineKey validation="3DES" />,啟用 3DES 加密 ViewState 內容,防止竊取。當 ViewState 過大(超過防火牆/Proxy 限制)時,ASP.NET 2.0 可自動分割為多個隱藏欄位。啟用方式:在頁面指示詞或 web.config 設定 MaxPageStateFieldLength(單位:Bytes,預設 -1 表不分塊)。例如 <%@ Page MaxPageStateFieldLength="1024" %> 將每欄位限制 1KB。