OutputCache, обслуживающий долговременные данные

Я 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 (действительно, это работает отлично для второго примера выше).

Ответ 1

Есть ли вероятность, что вы используете пользовательский поставщик кэша вывода? Гипотетически, если бы существовал пользовательский провайдер, использующий, скажем, скользящее окончание, а не абсолютное, вы увидите такие симптомы.