Принимает ли MVC OutputCaching преимущество над настройкой заголовков ответа кеша? - PullRequest
8 голосов
/ 02 ноября 2010

Этот вопрос относится к моему другому вопросу .

У меня есть приложение MVC с отключенным кэшированием для всех действий контроллера.Я делаю это, устанавливая заголовки ответа кеша в Application_BeginRequest:

    protected void Application_BeginRequest()
    {
        HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
        HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();
    }

Существует одно действие контроллера, для которого я хочу включить кэширование.Я украсил это действие атрибутом OutputCache:

[OutputCache(Duration = 300, VaryByParam = "id")]

Что теперь происходит с этим действием?Кэшируется ли он из-за атрибута OutputCache или не кэшируется из-за заголовков ответов?

- EDIT -

Как представляется, ответЗаголовки имеют предпочтение.Поэтому у меня возникает вопрос: как я могу включить кэш для действий одного контроллера?Перезаписать заголовки ответа снова?

Ответы [ 2 ]

7 голосов
/ 02 ноября 2010

две вещи являются отдельными; кэш ответов , в основном , смотрит на то, что видит клиент - что они будут использовать, не обращаясь к серверу, или какую модифицированную дату они отправят на сервер.

OutputCache, однако, ориентирован на сервер ; запрос все равно будет происходить (в отличие от чего-то, кэшированного на клиенте), но вполне возможно (надеюсь, что) ваш метод не будет вызываться: вместо этого будет возвращена кэшированная версия.

Итак: не кэшируется на клиенте; выполняется HTTP-запрос, и (для запросов в течение 5 минут для того же id, если позволяет память) версия в кэше возвращается с сервера (как правило, снижая IO и загрузку ЦП на сервере). Имеет смысл?

2 голосов
/ 03 ноября 2010

Заголовки ответа обеспечивают контроль кэша. Решение не состояло в том, чтобы установить заголовки ответа для действий контроллера, которые требуют кэширования. Вместо использования OutputCache я теперь использую пользовательский атрибут кэша, который также устанавливает ключ ISCACHED в словаре элементов запроса. Фрагмент кода из моего вопроса был изменен на:

    protected void Application_EndRequest()
    {
        if (HttpContext.Current.Items["ISCACHED"] == null)
        {
            var cache = HttpContext.Current.Response.Cache;
            cache.SetCacheability(HttpCacheability.NoCache);
            cache.SetNoStore();
            cache.SetExpires(DateTime.Now.AddDays(-1));
        }
    }

Мне пришлось переместить это с BeginRequest на EndRequest, чтобы действия могли сначала установить элемент запроса ISCACHED. Если он установлен, контроллер уже обработал кэширование для этого запроса, в противном случае кэширование отключено.

...