Dot-Net

OutputCache 提供長期過時的數據

  • July 1, 2011

我很困惑……這個這個“元”問題……

一個非常基本的http請求:

GET http://stackoverflow.com/feeds/tag?tagnames=c%23&sort=newest HTTP/1.1
Host: stackoverflow.com
Accept-Encoding: gzip,deflate

它擊中了一條裝飾有以下內容的路線:

[OutputCache(Duration = 300, VaryByParam = "tagnames;sort",
   VaryByContentEncoding = "gzip;deflate", VaryByCustom = "site")]

如果您包含 if-modified-since 或200的舊數據,則重複且不正確地提供 304(無更改) ,即

HTTP/1.1 200 OK
Cache-Control: public, max-age=0
Content-Type: application/atom+xml; charset=utf-8
Content-Encoding: gzip
Expires: Fri, 01 Jul 2011 09:17:08 GMT
Last-Modified: Fri, 01 Jul 2011 09:12:08 GMT
Vary: *
Date: Fri, 01 Jul 2011 09:42:46 GMT
Content-Length: 14714
(payload, when decoded = some long-stale data)

如您所見,它在 5 分鐘後的近半小時內提供服務;看起來 OutputCache 的內部根本沒有註意到時間;p 它最終會過期(事實上,它已經過期了——我的Fri, 01 Jul 2011 09:56:20 GMT請求終於得到了新的數據),但沒有任何地方像準時一樣。

更新:

相信如果我們去掉 accept-encoding 標頭,它會起作用,但不是;這也失敗了 - 它只是在不同的循環中失敗(這是我們應該期待的,因為密鑰不同,由 提供VaryByContentEncoding):

GET http://stackoverflow.com/feeds/tag?tagnames=c%23&sort=newest HTTP/1.1
Host: stackoverflow.com

給出:

HTTP/1.1 200 OK
Cache-Control: public, max-age=0
Content-Type: application/atom+xml; charset=utf-8
Expires: Fri, 01 Jul 2011 10:09:58 GMT
Last-Modified: Fri, 01 Jul 2011 10:04:58 GMT
Vary: *
Date: Fri, 01 Jul 2011 10:17:20 GMT
Content-Length: 66815
(payload = some stale data)

再一次,您會注意到它是在之後 Expires送達的。

那麼:這裡有什麼問題?

額外的; 當我們使用自定義選項時,根據MSDNGetVaryByCustomString() ,我們正確呼叫base.GetVaryByCustomString(ctx, custom)了它無法辨識的選項(實際上,這對於上面的第二個範例來說很好用)。

您是否有機會使用自定義輸出記憶體提供程序? 假設,如果有一個自定義提供程序使用滑動過期而不是絕對過期,您會看到這樣的症狀。

引用自:https://stackoverflow.com/questions/6546444