Dot-Net
OutputCache 提供長期過時的數據
我很困惑……這個和這個“元”問題……
一個非常基本的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送達的。那麼:這裡有什麼問題?
額外的; 當我們使用自定義選項時,根據MSDN
GetVaryByCustomString(),我們正確呼叫base.GetVaryByCustomString(ctx, custom)了它無法辨識的選項(實際上,這對於上面的第二個範例來說很好用)。
您是否有機會使用自定義輸出記憶體提供程序? 假設,如果有一個自定義提供程序使用滑動過期而不是絕對過期,您會看到這樣的症狀。