создание подкласса проблем с кэшем вывода в mvc3

У меня возникают некоторые проблемы с пониманием того, что происходит, когда я создаю простой подкласс OutputCacheAttribute в MVC3. Вот код:

public class ExampleOutputCacheAttribute : OutputCacheAttribute
{
    public ExampleOutputCacheAttribute()
    {
       // breakpoint here
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // breakpoint here

        base.OnActionExecuting(filterContext);  
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // breakpoint here

        base.OnActionExecuted(filterContext);

    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        // breakpoint here

        base.OnResultExecuting(filterContext);

    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
         // breakpoint here

        base.OnResultExecuted(filterContext);

    }
}

При первом запросе действия контроллера с этим атрибутом выполняется обращение к конструктору и всем переопределенным методам, но если я обновляю страницу, ни один из методов или конструктор не срабатывает. Это как если бы кеш считывался извне OutputCacheAttribute, но, глядя на исходный код MVC для OutputCacheAttribute, я вижу, что в OnActionExecuting есть код для проверки кешированной страницы и возврата результата:

filterContext.Result = new ContentResult() { Content = cachedValue };

Может ли кто-нибудь пролить свет на то, что происходит?


person Paul Hiles    schedule 21.09.2011    source источник


Ответы (1)


Кажется, что фильтр OutputCache сложнее, чем кажется на первый взгляд. Для кэширования страниц он подключается к стандартному механизму кэширования вывода ASP.NET, который использует OutputCacheModule HttpModule в IIS. После однократного попадания в фильтр и добавления страницы в кеш последующие запросы никоим образом не попадают в фильтр. OutputCacheModule перехватывает эти запросы и возвращает кэшированный объект выше по конвейеру.

Для кеширования действий используется отдельный механизм. При этом используется статический MemoryCache, а конструктор и все переопределенные методы выполняются при каждом запросе.

person Paul Hiles    schedule 23.09.2011