Ответ 1
Есть ли вероятность, что вы используете пользовательский поставщик кэша вывода? Гипотетически, если бы существовал пользовательский провайдер, использующий, скажем, скользящее окончание, а не абсолютное, вы увидите такие симптомы.
Я flumoxed... re this и этот "мета" вопросы...
Очень простой 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")]
повторно и неправильно, обслуживающий либо 304 (без изменений), если вы включаете if-modified-since или старые данные для 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
, наконец, получил свежие данные), но не в любом месте, как пунктуально.
UPDATE:
Я считал, что он работает, если мы забрали заголовок accept-encoding, но no; это тоже не сработает - он просто терпит неудачу в другом цикле (чего и следовало ожидать, поскольку ключи разные, любезно 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 (действительно, это работает отлично для второго примера выше).
Есть ли вероятность, что вы используете пользовательский поставщик кэша вывода? Гипотетически, если бы существовал пользовательский провайдер, использующий, скажем, скользящее окончание, а не абсолютное, вы увидите такие симптомы.