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

ASP.NET 防止瀏覽器快取頁面的正確方法

     編輯:ASP.NET 基礎

瀏覽器(特別是 IE)預設會快取頁面,導致資料更新後使用者仍看到舊內容。本文說明為何會發生此問題,並提供伺服器端與用戶端兩種解決方案,推薦使用伺服器端 HTTP 標頭控制。

一、問題成因

首次造訪 `Page1.aspx` 後,IE 將回應存入「暫存網路檔案」。再次造訪時,若伺服器未明確指示不快取,IE 直接讀取本地快取,**不發送新請求**,導致使用者看不到最新資料。

二、用戶端設定(不推薦)

要求使用者手動調整 IE 設定:

  1. 「網際網路選項」→「一般」→「瀏覽歷程記錄」→「設定」
  2. 勾選「每次造訪網頁時都檢查較新的網頁內容」
  3. 同時刪除暫存檔

缺點: 依賴使用者操作,不可控,生產環境不可行。

三、伺服器端方案(推薦,一行搞定)

在 **`Page_Load`** 事件中加入:


protected void Page_Load(object sender, EventArgs e)
{
    // 禁止瀏覽器與 Proxy 快取此頁面
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    
    // 其餘頁面邏輯...
}

此行程式碼效果:

  • 回應標頭加入:Cache-Control: no-cache, no-store
  • Pragma: no-cache(HTTP/1.0 相容)
  • Expires: -1(立即過期)
  • 瀏覽器**每次都會重新向伺服器請求**,不使用本地快取。

四、更完整的防快取標頭組合(適用於動態頁面、API、敏感資料)


protected void Page_Load(object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();           // 嚴禁儲存任何快取
    Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); // 設定過期為過去
    Response.Cache.SetValidUntilExpires(false);
    Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); // 強制驗證
    
    // 若為 Web API / Generic Handler (ashx)
    // context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    // context.Response.Cache.SetNoStore();
}

五、靜態資源(CSS/JS/圖片)建議「快取 + 版本號」而非禁用

對於不常變更的靜態檔案,**禁用快會降低效能**。正確做法:

  • 設定長期快取(`Cache-Control: max-age=31536000, immutable`)
  • 檔名或查詢字串加入版本號/雜湊:`style.css?v=20240115` 或 `style.abc123.css`
  • 內容變更時更新版本號,瀏覽器自動下載新檔

六、驗證方式

  1. 開啟瀏覽器開發人員工具(F12)→ Network 頁籤
  2. 重新整理頁面
  3. 檢查回應標頭是否包含 `Cache-Control: no-cache, no-store`
  4. 確認 Size 欄顯示 `(from disk cache)` 或 `(from memory cache)` → 表示仍被快取,需調整標頭

七、總結

場景建議策略
動態資料頁面(GridView、報表、儀表板)`Response.Cache.SetCacheability(HttpCacheability.NoCache)`
敏感資料(個資、金流、驗證碼)加上 `SetNoStore()`,防止寫入磁碟
靜態資源(CSS、JS、圖片、字型)長期快取 + 檔名版本控制
API 回應(JSON/XML)`NoCache` + `NoStore`,避免 Proxy 快取導致資料過期

在 `Page_Load` 加入一行 `Response.Cache.SetCacheability(HttpCacheability.NoCache)`,即可徹底解決 ASP.NET 網頁快取導致的資料不更新問題,簡單有效。

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