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

ASP.NET 頁面輸出快取:@OutputCache 指令聲明式設定完整說明

     編輯:.NET 實例教學

ASP.NET 提供 **頁面輸出快取**,將渲染後的 HTML 直接儲存於伺服器記憶體、用戶端瀏覽器或 Proxy 伺服器,後續相同請求可跳過頁面生命週期直接回傳,大幅提升效能。最簡單的方式是在 `.aspx` 頁面頂端加入 `@OutputCache` 指令進行聲明式設定。

基本語法

<%@ OutputCache Duration="秒數" VaryByParam="參數名稱" [Location="位置"] [VaryByCustom="自訂字串"] [VaryByHeader="Header名稱"] [NoStore="true|false"] [SqlDependency="資料庫相依性"] %>

必要屬性 (缺一不可)

屬性說明範例
Duration快取持續秒數 (必須 > 0)`Duration="60"` (快取 60 秒)
VaryByParam依查詢字串/表單參數變化建立不同快取版本。`*` 表示所有參數;`none` 表示不依參數變化`VaryByParam="id"` / `VaryByParam="*"` / `VaryByParam="none"`

常用選用屬性

屬性說明值/範例
Location快取儲存位置 (列舉 OutputCacheLocation)`Any` (預設, 伺服器+用戶端+Proxy)
`Client` (僅瀏覽器)
`Server` (僅伺服器)
`ServerAndClient` (伺服器+瀏覽器)
`None` (停用輸出快取)
`Any` (預設)
VaryByCustom自訂快取變異鍵,需在 `Global.asax` 覆寫 `GetVaryByCustomString``VaryByCustom="browser"` (內建,依瀏覽器類型/版本)
`VaryByCustom="userRole"` (自訂)
VaryByHeader依 HTTP Header 變化建立不同快取 (如 `Accept-Language`、`User-Agent`)`VaryByHeader="Accept-Language"`
NoStore`true` 時發送 `Cache-Control: no-store`,防止敏感資料被快取 (Proxy/瀏覽器)`NoStore="true"`
SqlDependencySQL Server 查詢通知相依性,資料異動時自動使快取失效`SqlDependency="CommandNotification"`
CacheProfile引用 `web.config` 中定義的 `` 設定檔`CacheProfile="LongTerm"`

OutputCacheLocation 列舉值對照

public enum OutputCacheLocation {
    Any,            // 伺服器、用戶端、Proxy 皆可快取 (預設)
    Client,         // 僅用戶端瀏覽器快取 (發送 Cache-Control: private)
    Server,         // 僅伺服器記憶體快取 (不發送客戶端快取標頭)
    ServerAndClient,// 伺服器 + 用戶端
    None,           // 停用輸出快取 (仍可程式碼控制)
    Downstream      // 僅 Proxy/下游快取 (罕用)
}

實戰範例

1. 簡單頁面快取 60 秒,不區分參數

<%@ OutputCache Duration="60" VaryByParam="none" %>

2. 依產品 ID 快取不同版本,僅伺服器端快取

<%@ OutputCache Duration="300" VaryByParam="productId" Location="Server" %>

3. 多語言網站:依瀏覽器語言與查詢字串快取

<%@ OutputCache Duration="600" VaryByParam="id" VaryByHeader="Accept-Language" Location="Server" %>

4. 使用者個人化頁面:依自訂角色快取 (需 Global.asax 配合)

<%@ OutputCache Duration="120" VaryByParam="*" VaryByCustom="userRole" Location="Server" %>
// Global.asax.cs
public override string GetVaryByCustomString(HttpContext context, string custom) {
    if (custom == "userRole") {
        // 依使用者角色產生快取鍵
        return context.User.IsInRole("Admin") ? "Admin" : "User";
    }
    return base.GetVaryByCustomString(context, custom);
}

5. 引用 web.config 快取設定檔 (集中管理)

<!-- web.config -->
<system.web>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="Default" duration="60" varyByParam="none" location="Server" />
      <add name="ProductDetail" duration="300" varyByParam="id" location="Server" />
      <add name="UserDashboard" duration="120" varyByParam="*" varyByCustom="userRole" location="Server" />
    </outputCacheProfiles>
  </outputCacheSettings>
</system.web>
<%@ OutputCache CacheProfile="ProductDetail" %>

進階:程式碼控制快取 (HttpCachePolicy)

聲明式指令無法涵蓋動態邏輯 (如依權限決定是否快取),可在 `Page_Load` 使用 `Response.Cache`:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(10));
Response.Cache.SetCacheability(HttpCacheability.Server); // 或 Public, Private
Response.Cache.VaryByParams["id"] = true;
Response.Cache.SetValidUntilExpires(true); // 忽略用戶端重新整理要求
// 若不想快取:
Response.Cache.SetNoStore();

常見誤區與避坑指南

誤區後果正確做法
敏感資料頁面 (帳號、訂單) 未設 `NoStore="true"` 或 `Location="Server"`Proxy/瀏覽器快取導致資料洩露 (共用電腦風險)個人化/敏感頁面:`Location="Server"` + `NoStore="true"`
`VaryByParam="*"` 濫用每個查詢字串組合產生獨立快取,記憶體暴增僅列出真正影響輸出的參數 (`id`, `category`)
快取靜態內容 (CSS/JS/圖片) 用 OutputCache不必要開銷,IIS 靜態檔案快取/壓縮/ETag 已足夠靜態資源用 `` / CDN
Postback 頁面啟用 OutputCacheViewState/事件驗證失效、使用者看到舊資料**含表單回發的頁面勿用 OutputCache**,改用資料快取 (`Cache.Insert`)
未設 `VaryByHeader="Accept-Language"` 多語言頁面不同語言使用者看到同一語言快取版本多語言頁面必加 `VaryByHeader="Accept-Language"`

OutputCache vs Data Cache (資料快取) 選擇指南

  • OutputCache:整頁 HTML 輸出相同、無使用者個人化、GET 請求為主、頻率高 (商品列表、新聞詳情、靜態報表)。
  • Data Cache (`Cache["key"] = data`):需組合多個資料來源、局部更新、含使用者特定邏輯、Postback 頁面、複雜物件快取。

現代 ASP.NET Core 對應

  • `[ResponseCache(Duration=60, Location=ResponseCacheLocation.Server, VaryByHeader="Accept-Language")]` 屬性標記 Controller Action。
  • `IDistributedCache` / `IMemoryCache` 程式碼控制資料快取。
  • 輸出快取中介軟體 `app.UseResponseCaching()` + 標頭控制。

善用 `@OutputCache` 聲明式快取,能以最少代碼獲得最大效能提升。關鍵在於精確設定 VaryBy* 變異條件、正確選擇 Location、敏感資料必加 NoStore,並定期監控快取命中率與記憶體使用量。

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