OutputCache提供长期陈旧的数据

时间:2011-07-01 09:59:23

标签: .net asp.net asp.net-mvc outputcache

我搞砸了......重新thisthis“元”问题......

一个非常基本的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或旧数据,则

重复 并且错误地 提供304(无更改) 200,即

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之后正在投放

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

附加;当我们使用自定义选项时,我们的GetVaryByCustomString()会根据MSDN正确调用base.GetVaryByCustomString(ctx, custom)以查找无法识别的选项(事实上,这适用于上面的第二个示例)。

1 个答案:

答案 0 :(得分:10)

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