【发布时间】:2023-03-31 14:36:01
【问题描述】:
一个非常基本的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() 正确调用 base.GetVaryByCustomString(ctx, custom) 以获取它无法识别的选项,就像 MSDN 一样(实际上这对于上面的第二个示例来说很好)。
【问题讨论】:
-
Marc 你的自定义输出缓存提供程序不会碰巧在某个地方开源吧?
-
@runxc1 我必须检查一下,但我们默认的“转到”工具是红色的,它是通过使用一些自定义包装器(不是)的 bookleeve(两者都是开源的)。但是,我认为这里的 redis 听起来是错误的——我得看看代码。
-
您找到自定义输出缓存提供程序了吗?只是好奇,因为感觉烤出来的真的很缺乏。
标签: .net asp.net asp.net-mvc outputcache