Как кешировать (cache) результат работы экшена контроллера в ASP.NET MVC?
Кеширование на уровне контроллеров в ASP.NET MVC
Новые ответы
Для кеширования в ASP.NET MVC служит атрибут [OutputCache]
, который применяется к методу или самому классу котроллера:
public class HomeController : Controller
{
[OutputCache(Duration=10)]
public ActionResult Index()
{
return View();
}
}
Параметры атрибута:
Duration — время, в течении которого возвращается кешированный результат вместо обычного;
VaryByParam — позволяет указать аргумент action-метода, для каждого значения которого нужно создавать собственный кеш. Например при такой реализации:
[OutputCache(Duration=10)]
public ActionResult Details(long id){
// Action logic
}
результат, возвращаемый методом, будет кешироваться один раз для всех возможных вариантов аргумента id
. Чтобы предотвратить такое поведение используется параметр VaryByParam
:
[OutputCache(Duration=10, VaryByParam="id")]
public ActionResult Details(long id){
// Action logic
}
Location — позволяет указать место хранения кеша. Возможные значения:
Any
— любое из возможных мест (значение по умолчанию)Client
— кеш хранится в браузере клиентаDownstream
— кеш может быть сохранен в любом HTTP 1.1 cache-совместимом устройстве, кроме основного сервера. Сюда могут включаться прокси-сервера и т.п.Server
— кеш сохраняется на том же сервере, где был сформирован ответ для клиента;None
— кеш не сохраняется;ServerAndClient
— кеш может сохраняться или на самом сервере или в браузере;
CacheProfile — задает имя секции конфигурации с настройками кеша. Позволяет перенести все настройки из самого атрибута в файл Web.config:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="HomePageCacheProfile" duration="3600" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
public class HomeController : Controller
{
[OutputCache(CacheProfile="HomePageCacheProfile")]
public ActionResult Index()
{
// Action logic
}
}
В статье "ASP.NET MVC Action Filter - Caching and Compression" предлагается создать ActionFilter и перекрыть его метод OnActionExecuted следующим образом:
using System;
using System.Web;
using System.Web.Mvc;
public class CacheFilterAttribute : ActionFilterAttribute
{
public int Duration
{
get;
set;
}
public CacheFilterAttribute()
{
Duration = 10;
}
public override void OnActionExecuted(FilterExecutedContext filterContext)
{
if (Duration <= 0) return;
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.Now.Add(cacheDuration));
cache.SetMaxAge(cacheDuration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
}
}
Затем можно применить фильтр к экшену:
[CacheFilter(Duration = 60)]
public void Category(string name, int? page)
Упс, это получается в той статье велосипед с треугольными колесами описан? :)
Когда писалась статья видимо это еще не было включено в MVC.