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

ASP.NET ViewState 儲存位置重導向:自訂 PageStatePersister 存至 Cache/Database 提升效能

     編輯:關於ASP.NET

預設 ViewState 經 Base64 編碼置於隱藏欄位 __VIEWSTATE,隨頁面往返傳輸,導致頻寬浪費、載入緩慢、安全風險。ASP.NET 允許透過繼承 PageStatePersister 將 ViewState 存至 **Cache、Session、Database、檔案** 等伺服器端介質,僅在頁面保留極小的 Token。

核心抽象類別

public abstract class PageStatePersister
{
    public PageStatePersister(Page page) { ... }
    public abstract void Save();   // 序列化並持久化 ViewState + ControlState
    public abstract void Load();   // 反序列化還原
    protected IStateFormatter StateFormatter { get; } // 內建 Base64 序列化器
    public Page Page { get; }
}

方案一:SessionPageStatePersister (內建)

protected override PageStatePersister PageStatePersister
{
    get { return new SessionPageStatePersister(this.Page); }
}

ViewState 存入 Session,適合小型應用、單伺服器。叢集環境需 Session 共享 (StateServer/SQLServer/Redis)。

方案二:自訂 CachePageStatePersister (高效能)

public class CachePageStatePersister : PageStatePersister
{
    public CachePageStatePersister(Page page) : base(page) { }

    public override void Save()
    {
        string key = "VS_" + Page.Session.SessionID + "_" + Page.Request.Path;
        // 儲存 Pair(ViewState, ControlState)
        var state = new Pair(ViewState, ControlState);
        string serialized = StateFormatter.Serialize(state);
        HttpRuntime.Cache.Insert(key, serialized, null,
            DateTime.Now.AddMinutes(20), TimeSpan.Zero);
        // 頁面僅保留 Token
        Page.ClientScript.RegisterHiddenField("__VIEWSTATE_TOKEN", key);
    }

    public override void Load()
    {
        string key = Page.Request.Form["__VIEWSTATE_TOKEN"];
        if (string.IsNullOrEmpty(key)) return;
        string serialized = HttpRuntime.Cache[key] as string;
        if (serialized != null)
        {
            var state = (Pair)StateFormatter.Deserialize(serialized);
            ViewState = state.First;
            ControlState = state.Second;
        }
    }
}

頁面繼承:

protected override PageStatePersister PageStatePersister
{
    get { return new CachePageStatePersister(this); }
}

比較與選型指南

方案優點缺點適用場景
隱藏欄位 (預設)零配置、無狀態頻寬大、Base64 可解碼簡單頁面、ViewState 小
Session內建、簡單Session 記憶體壓力、序列化成本中小應用、單機/共享 Session
Cache (自訂)可控過期、不佔 Session、高效能需管理 Key、叢集需分散式 Cache高流量、大 ViewState、叢集 (Redis)
Database持久、可審計、跨伺服器I/O 開銷大合規要求、超長壽命 ViewState

安全加固

  • 啟用 <pages enableViewStateMac="true" viewStateEncryptionMode="Auto" /> (預設開啟)。
  • 自訂 Persister 同樣受 StateFormatter 保護 (MAC + 加密)。
  • Token 使用不可預測亂數 (Guid + 路徑 + SessionID) 防止枚舉。

合理導向 ViewState 儲存位置,能顯著降低頻寬、提升首屏速度、增強安全性。

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