Как отключить кэширование для запросов 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, которое исключило бы вашу проблему как побочный эффект.