首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 伺服器控制項 ViewState 深度解析

     編輯:關於ASP.NET

HTTP 是無狀態協定,ASP.NET 透過 ViewState(視圖狀態) 讓頁面與控制項在往返之間保持狀態。本文詳細說明 ViewState 運作機制、支援型別、效能與安全考量、以及 ASP.NET 2.0 新增的分塊功能。

1. 運作機制

每當使用者請求 .aspx 頁面,.NET 框架將相關控制項的狀態資料序列化為字串,存放於名為 __VIEWSTATE 的隱藏欄位中隨頁面輸出至瀏覽器。首次請求時通常為空或預設值;回傳時則包含前一次回傳的屬性狀態,使控制項能還原先前狀態。此過程由框架自動處理,開發者無感知。

2. 支援的資料型別

ViewState 內建優化序列化的型別包括:String、Int32、Boolean、Color、Array、ArrayList、Hashtable 以及實作 TypeConverter 的自訂型別。使用這些型別可獲得最佳效能;若儲存複雜物件,框架會退回二進位序列化,耗費資源較大。

3. 效能與安全性

效能調優

  • 預設啟用 ViewState,若控制項無伺服器端事件、無動態/資料繫結屬性,應設定 EnableViewState="false" 關閉。
  • 避免在 ViewState 存放大量資料(如整個 DataSet),導致頁面體積膨脹、傳輸延遲。

安全機制

ViewState 以 Base64 編碼明文傳輸,若含敏感資料(密碼、連線字串)有洩漏風險。ASP.NET 提供兩層防護:

  • MAC 校驗:設定 EnableViewStateMac="true"(預設開啟),框架以 SHA1(或透過 <machineKey validation="MD5" /> 改用 MD5)產生雜湊碼附加於 ViewState,回傳時驗證完整性。
  • 加密:在 machine.config 設定 <machineKey validation="3DES" />,啟用 3DES 加密 ViewState 內容,防止竊取。

4. ViewState 分塊

當 ViewState 過大(超過防火牆/Proxy 限制)時,ASP.NET 2.0 可自動分割為多個隱藏欄位。啟用方式:在頁面指示詞或 web.config 設定 MaxPageStateFieldLength(單位:Bytes,預設 -1 表不分塊)。例如 <%@ Page MaxPageStateFieldLength="1024" %> 將每欄位限制 1KB。

最佳實務建議

  1. 僅在必要控制項啟用 ViewState。
  2. 儲存簡單型別,避免複雜物件圖。
  3. 生產環境務必開啟 MAC 校驗,敏感資料加密。
  4. 監控 ViewState 大小,必要時啟用分塊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved