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

ViewState 機制深度解析(三):StateBag 實作、ControlState 與優化策略

     編輯:關於.NET

前言

本系列第三部分深入剖析 StateBag 內部實作、ControlState 差異、ViewState 優缺點與安全性、壓縮與儲存位置優化方案。

一、 StateBag 核心實作

StateBag 實作 IStateManager、IDictionary,是具備狀態追蹤能力的字典。內部將 Value 包裝為 StateItem:

public sealed class StateItem
{
    internal StateItem(object initialValue);
    public bool IsDirty { get; set; } // 標記是否被修改
    public object Value { get; set; }
}

關鍵方法流程

  1. Add(key, value):新增或更新項目。若 marked=true(已呼叫 TrackViewState),設定 IsDirty=true。
  2. LoadViewState(object state):反序列化 ArrayList(Key/Value 交替),呼叫 Add 還原。此時所有項目 IsDirty=true。
  3. SaveViewState():僅序列化 IsDirty=true 的項目至 ArrayList 回傳。
  4. TrackViewState():設定 marked=true,啟動狀態追蹤。

結論:只要屬性曾被修改(即使後續恢復原值),IsDirty 永遠為 true,導致每次 PostBack 都序列化該項目。

二、 ControlState 與 ViewState 差異

特性ViewStateControlState
可停用是(EnableViewState=false)否(不可停用)
實作方式框架自動管理開發者手動實作
儲存位置__VIEWSTATE 隱藏欄位同 __VIEWSTATE(序列化在一起)
啟用條件預設開啟需在 OnInit 呼叫 RegisterRequiresControlState
適用場景一般屬性保持關鍵資料(如 GridView 分頁索引)必須保持

ControlState 需重寫 SaveControlState、LoadControlState 自定序列化邏輯。

三、 ViewState 優缺點與安全性

優點

  • 不佔用伺服器記憶體(Client-side)。
  • 框架自動維護,易用。
  • 無逾時問題,跨瀏覽器相容。

缺點

  • 增加頁面大小(雙向傳輸),不適合大量資料。
  • 行動裝置頻寬/記憶體受限。
  • 預設僅 Base64 編碼,可被竄改(雖有 MAC 保護)。

安全性三層防護

  1. MAC (Message Authentication Code):EnableViewStateMAC=true(預設開啟),SHA1/MD5 雜湊防竄改。
  2. 加密:ViewStateEncryptionMode=Always 或呼叫 RegisterRequiresViewStateEncryption 啟用 AES 加密。
  3. ViewStateUserKey:在 Page_Init 設定唯一使用者金鑰,防 CSRF 攻擊。

四、 停用與優化策略

停用層級

  • 控件:<asp:GridView EnableViewState="false" />
  • 頁面:<%@ Page EnableViewState="False" %>
  • 應用程式:<pages enableViewState="false" /> in web.config

適用停用場景

  • 純顯示控件(無伺服器事件、無動態屬性)。
  • 資料繁重的 GridView/Repeater(改用資料重新繫結)。

優化方向

  1. 壓縮:GZip/Deflate 壓縮序列化後的位元組陣列,減少 60-80% 體積。參考實作
  2. 移出頁面:儲存於 Session、快取、資料庫或檔案系統,頁面僅保留 Key。參考實作

結語

理解 StateBag 的 IsDirty 機制、區分 ViewState/ControlState 職責、依場景啟用安全性與優化手段,是構建高效能、安全 ASP.NET 應用的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved