瀏覽器(特別是 IE)預設會快取頁面,導致資料更新後使用者仍看到舊內容。本文說明為何會發生此問題,並提供伺服器端與用戶端兩種解決方案,推薦使用伺服器端 HTTP 標頭控制。
首次造訪 `Page1.aspx` 後,IE 將回應存入「暫存網路檔案」。再次造訪時,若伺服器未明確指示不快取,IE 直接讀取本地快取,**不發送新請求**,導致使用者看不到最新資料。
要求使用者手動調整 IE 設定:
缺點: 依賴使用者操作,不可控,生產環境不可行。
在 **`Page_Load`** 事件中加入:
protected void Page_Load(object sender, EventArgs e)
{
// 禁止瀏覽器與 Proxy 快取此頁面
Response.Cache.SetCacheability(HttpCacheability.NoCache);
// 其餘頁面邏輯...
}
Cache-Control: no-cache, no-storePragma: no-cache(HTTP/1.0 相容)Expires: -1(立即過期)
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();
}
對於不常變更的靜態檔案,**禁用快會降低效能**。正確做法:
| 場景 | 建議策略 |
|---|---|
| 動態資料頁面(GridView、報表、儀表板) | `Response.Cache.SetCacheability(HttpCacheability.NoCache)` |
| 敏感資料(個資、金流、驗證碼) | 加上 `SetNoStore()`,防止寫入磁碟 |
| 靜態資源(CSS、JS、圖片、字型) | 長期快取 + 檔名版本控制 |
| API 回應(JSON/XML) | `NoCache` + `NoStore`,避免 Proxy 快取導致資料過期 |
在 `Page_Load` 加入一行 `Response.Cache.SetCacheability(HttpCacheability.NoCache)`,即可徹底解決 ASP.NET 網頁快取導致的資料不更新問題,簡單有效。