Как отключить кеширование для запросов MVC, но не для статических файлов в IIS7? - PullRequest
6 голосов
/ 02 ноября 2010

Я занимаюсь разработкой приложения ASP.NET 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();
    }

Приложение работает на IIS7 с настройкой конфигурации модулей runAllManagedModulesForAllRequests="true".Это означает, что все статические файлы также проходят через конвейер запросов (и кэширование отключается).

Каков наилучший способ сохранить кэширование для этих статических файлов?Нужно ли проверять расширение перед установкой заголовков кэша ответов в Application_BeginRequest или есть более простой способ (например, вообще обойти конвейер запросов для статических файлов)?

Ответы [ 2 ]

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

Предполагая, что вы не можете избежать использования runAllManagedModulesForAllRequests="true", как в ссылке Гектора, вы можете проверить тип обработчика запроса и установить заголовки кэширования, только если запрос обрабатывается MVC.

protected void Application_PreRequestHandlerExecute()
{
    if ( HttpContext.Current.CurrentHandler is MvcHandler )
    {
        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();
    }
}

Обратите внимание, что я переместил код в Application_PreRequestHandlerExecute, потому что обработчик еще не был выбран в BeginRequest, поэтому HttpContext.Current.CurrentHandler равно нулю.

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

У вас может быть атрибут фильтра кэширования, который применяет его ко всем вашим действиям (либо через базовый контроллер, либо явно на каждом контроллере или действии).Это не относится к статическим файлам.

Возможно [CacheFilter]:

using System;
using System.Web;
using System.Web.Mvc;

    public class CacheFilterAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;

            cache.SetExpires(DateTime.UtcNow.AddDays(-1));
            cache.SetValidUntilExpires(false);
            cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
            cache.SetCacheability(HttpCacheability.NoCache);
            cache.SetNoStore();
        }
    }

Помимо этого, вы даже можете доставлять статические файлы из другого домена, как это делает SO * с sstatic.net ,устранит вашу проблему как побочный эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...