Кеширование на уровне контроллеров в ASP.NET MVC - CodeHelper

Кеширование на уровне контроллеров в ASP.NET MVC

3

Как кешировать (cache) результат работы экшена контроллера в ASP.NET MVC?

Новые ответы


4

Для кеширования в 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
    }
}
safonovea

Упс, это получается в той статье велосипед с треугольными колесами описан? :)

admax

Когда писалась статья видимо это еще не было включено в MVC.

1

В статье "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)
admax

Такой вариант позволяет кешировать только на стороне клиента (в браузере), в то время как теперь уже стандартный атрибут OutputCache можно использовать для кеширования как на сервере так и на клиенте.


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.