ASP.NET OutputCache 模組透過 OutputCacheModule 在管線中掛載 ResolveRequestCache(讀取快取)與 UpdateRequestCache(寫入快取)事件。快取分為兩層:快取策略(CachedVary)與 快取資料(CachedRawResponse)。一個策略可對應多筆資料(如依查詢字串、Header 區分)。核心在於 CreateOutputCachedItemKey 如何依據請求特徵生成唯一鍵值。
方法簽名:CreateOutputCachedItemKey(HttpContext context, CachedVary cachedVary)
cachedVary = null → 僅含 HTTP 動詞 + 路徑。cachedVary != null → 依策略設定追加 VaryByHeader、QueryString、Form、Custom、ContentEncoding 等維度。StringBuilder builder;
if (verb == HttpVerb.POST)
builder = new StringBuilder("a1", path.Length + 2);
else
builder = new StringBuilder("a2", path.Length + 2);
builder.Append(CultureInfo.InvariantCulture.TextInfo.ToLower(path));
// 例:GET /Home/Index → "a2/home/index"
對 i = 0..2 執行,分別處理:
| 階段 | 標記 | 來源 | 條件 |
|---|---|---|---|
| 0 | H | cachedVary._headers (VaryByHeader) | ServerVariables |
| 1 | Q | cachedVary._params (VaryByParam) | QueryString + _varyByAllParams |
| 2 | F | cachedVary._params (VaryByParam) | POST 且 Form + _varyByAllParams |
每階段邏輯:
array 與值集合 serverVarsWithoutDemand。_varyByAllParams == true(即 VaryByParam="*"),則取該集合所有鍵,轉小寫、排序。N{key}V{value},值為 null 時用 +n+ 代替。N{customKey}V{customValue},值由 GetVaryByCustomString 取得,異常則用 +e+。_varyByAllParams 時,將 Request Body 雜湊 (Base64) 附加。_contentEncodings 清單中則附加編碼名稱。| CachedVary 屬性 | 對應 OutputCache 設定 | 影響鍵值條件 |
|---|---|---|
| _headers | VaryByHeader | Header 名稱/值不同 → 鍵不同 |
| _params | VaryByParam | 參數名稱/值不同 → 鍵不同 |
| _varyByAllParams | VaryByParam="*" | true 時所有 QueryString/Form 參數皆納入 |
| _varyByCustom | VaryByCustom | 自訂字串 + GetVaryByCustomString 回傳值 |
| _contentEncodings | VaryByContentEncoding | 回應編碼符合清單 → 附加編碼名 |