Почему кэширование вывода не работает для моего приложения 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, и теперь все работает так, как ожидалось.