Почему кэширование вывода не работает для моего приложения ASP.NET MVC 4?
У меня возникла проблема, когда выходное кэширование, похоже, не работает на моем веб-сайте ASP.NET MVC 4 (EPiServer 7).
У меня есть следующий профиль выходного кэша в моем web.config
:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="PageOutput" enabled="true" duration="300" varyByParam="*" location="ServerAndClient" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
И вот моя конфигурация кэширования вывода для статических ресурсов:
<caching>
<profiles>
<add extension=".gif" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".png" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".js" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".css" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="00:01:00" location="Any" />
<add extension=".jpg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".jpeg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="00:01:00" location="Any" />
</profiles>
</caching>
И мой контроллер украшен атрибутом кэша вывода следующим образом:
[OutputCache(CacheProfile = "PageOutput")]
public class HomePageController : BasePageController<HomePage>
{ ...}
Я смотрю следующие счетчики в perfmon, но не вижу, чтобы они увеличивались, как ожидалось, когда я посещаю домашнюю страницу:
-
\ASP.NET Apps v4.0.30319(__Total__)\Output Cache Entries
-
\ASP.NET Apps v4.0.30319(__Total__)\Output Cache Hits
Я также тестировал с помощью tinyget
следующим образом:
tinyget -srv:mywebsite -uri:/ -threads:1 -loop:20
Любые советы будут очень признательны!
Ответы
Ответ 1
Итак, оказывается, что OutputCaching работает, просто мой метод тестирования был ошибочным. Результат действия будет кэшироваться только в том случае, если ответ не содержит cookie. Конечно, первый ответ всегда включает файл cookie, если у вас включен сеанс ASP.NET, который мы делаем. Поэтому первые заголовки ответов выглядят следующим образом:
HTTP/1.1 200 OK
Cache-Control: private, max-age=600
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Tue, 26 Nov 2013 03:48:44 GMT
Last-Modified: Tue, 26 Nov 2013 03:38:44 GMT
Vary: *
Set-Cookie: ASP.NET_SessionId=kbnhk4lphdlcpozcumpxilcd; path=/; HttpOnly
X-UA-Compatible: IE=Edge
Date: Tue, 26 Nov 2013 03:38:44 GMT
Content-Length: 9558
Предполагая, что ваш браузер или тестовый инструмент может принимать файлы cookie и включать их в последующие запросы, следующий запрос на ту же страницу приведет к заголовкам HTTP-ответа так:
HTTP/1.1 200 OK
Cache-Control: private, max-age=598
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Tue, 26 Nov 2013 03:48:45 GMT
Last-Modified: Tue, 26 Nov 2013 03:38:45 GMT
Vary: *
X-UA-Compatible: IE=Edge
Date: Tue, 26 Nov 2013 03:38:45 GMT
Content-Length: 9558
Поскольку в ответе нет информации о конкретном клиенте, вывод теперь можно кэшировать, как ожидалось.
Итак, урок заключается в том, что при тестировании кэширования вывода используется инструмент тестирования, который может принимать и возвращать файлы cookie в последующих запросах.
В итоге мы использовали Jmeter, а не tinyget, и теперь все работает так, как ожидалось.