проблемы с выходным кешем в mvc3 - PullRequest
1 голос
/ 21 сентября 2011

У меня возникают некоторые проблемы с пониманием того, что происходит, когда я создаю простой подкласс 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 };

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

1 Ответ

0 голосов
/ 23 сентября 2011

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

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

...