2010-11-02 10 views
6

Estoy desarrollando una aplicación ASP.NET MVC. La mayoría de las acciones del controlador no se deben almacenar en caché. Debido a esta salida me encabezados no-cache en Application_BeginRequest:¿Cómo se desactiva el almacenamiento en caché para solicitudes MVC pero no para archivos estáticos en IIS7?

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(); 
    } 

La aplicación se ejecuta en IIS 7 con la configuración de los módulos de configuración runAllManagedModulesForAllRequests="true". Esto significa que todos los archivos estáticos también pasan por la interconexión de solicitudes (y el almacenamiento en caché está deshabilitado).

¿Cuál es la mejor manera de mantener el almacenamiento en caché habilitado para estos archivos estáticos? ¿Tengo que verificar la extensión antes de configurar los encabezados de caché de respuesta en Application_BeginRequest o hay una manera más fácil (como pasar por alto la tubería de solicitud para archivos estáticos por completo)?

+2

Esto se ve prometedor http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html –

Respuesta

3

Suponiendo que no puede evitar el uso de runAllManagedModulesForAllRequests="true" como en el enlace de Hector, puede verificar el tipo de controlador de solicitud y solo establecer los encabezados de almacenamiento en caché si la solicitud está siendo manejada por 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(); 
    } 
} 

Tenga en cuenta que me he movido el código en Application_PreRequestHandlerExecute porque el controlador aún no ha sido elegido en BeginRequest, por lo HttpContext.Current.CurrentHandler es nulo.

+0

Esto funciona muy bien. También le permite configurar el control de caché personalizado para archivos estáticos en la instrucción else. – Carvellis

3

Puede tener un atributo de filtro de caché que aplica esto a todas sus acciones (ya sea a través de un controlador base o explícitamente en cada controlador o acción). Esto no se aplicaría a tus archivos estáticos.

Posible [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(); 
     } 
    } 

Como acotación al margen, incluso podría entregar sus archivos estáticos de un dominio diferente, como también lo hacen con sstatic.net, lo que eliminaría el problema como un efecto secundario.

Cuestiones relacionadas