OutputCache提供长期陈旧的数据

Mar*_*ell 11 .net asp.net asp.net-mvc outputcache

我搞砸了...... 这个这个 "元"问题......

一个非常基本的http请求:

GET http://stackoverflow.com/feeds/tag?tagnames=c%23&sort=newest HTTP/1.1
Host: stackoverflow.com
Accept-Encoding: gzip,deflate
Run Code Online (Sandbox Code Playgroud)

击中路线装饰:

[OutputCache(Duration = 300, VaryByParam = "tagnames;sort",
    VaryByContentEncoding = "gzip;deflate", VaryByCustom = "site")]
Run Code Online (Sandbox Code Playgroud)

如果你包括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)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它是服务于这个近半个小时过去的 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
Run Code Online (Sandbox Code Playgroud)

得到:

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)
Run Code Online (Sandbox Code Playgroud)

再一次,你会注意到它正在服务之后 Expires.

那么:这里可能出现什么问题?

额外; 当我们使用自定义选项时,我们GetVaryByCustomString()正确地调用base.GetVaryByCustomString(ctx, custom)它无法识别的选项,如MSDN(事实上​​,这适用于上面的第二个示例).

Nic*_*ver 10

您是否有可能使用自定义输出缓存提供程序? 假设有一个自定义提供者使用滑动过期而不是绝对过期,你会看到这样的症状.

  • 是; 事实证明***我们很糟糕*** (5认同)
  • 缓存被高估,您的网站应该足够快,不需要它. (3认同)