10

У меня возникла проблема, когда выходное кэширование не работает для моего веб-сайта ASP.NET MVC 4 (EPiServer 7).Почему кэширование вывода не работает для моего приложения ASP.NET MVC 4?

У меня есть следующий выходной профиль кэша в моем 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 

Любой совет был бы благодарен!

ответ

15

Итак, оказывается, что 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 

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

+4

«Результат действия будет зашифрован только в том случае, если ответ не содержит файл cookie» - вы спасли мой день. благодаря –