Как отключить кэширование для запросов MVC, но не для статических файлов в IIS7?

Я разрабатываю ASP.NET приложение MVC. Большинство действий контроллера не должны кэшироваться. Из-за этого я выводил заголовки no-cache в 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 ответов


предполагая, что вы не можете избежать использования 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 равно null.


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

Возможно [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();
        }
    }

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