2010-11-02 11 views
8

Esta pregunta está relacionada con my other question.¿MVC OutputCaching tiene preferencia sobre la configuración de los encabezados de respuesta de caché?

Tengo una aplicación MVC con el almacenamiento en caché desactivado para todas las acciones del controlador. Hago esto mediante el establecimiento de cabeceras de respuesta en caché 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(); 
    } 

Hay acción único controlador para el que yo quiero almacenamiento en caché habilitado. He decorado esta acción con el atributo OutputCache:

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

¿Qué pasa ahora para esta acción? ¿Se almacena en caché debido al atributo OutputCache o no se almacena en caché debido a los encabezados de respuesta?

- EDITAR -

Por lo que parece, las cabeceras de respuesta tienen preferencia. Entonces mi pregunta es: ¿cómo puedo habilitar el caché para acciones de controlador único? ¿Sobrescribir los encabezados de respuesta nuevamente?

Respuesta

2

Los encabezados de respuesta imponen el control de caché. La solución no fue establecer encabezados de respuesta para las acciones del controlador que requieren el almacenamiento en caché. En lugar de usar OutputCache, ahora estoy usando un atributo de caché personalizado que también establece una clave ISCACHED en el diccionario de elementos de solicitud. El fragmento de código de mi pregunta fue cambiado a esto:

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

tuve que mover esto desde BeginRequest a EndRequest, para permitir que las acciones para establecer primero el elemento ISCACHED petición. Si está configurado, un controlador ya manejó el almacenamiento en caché para esta solicitud; de lo contrario, el almacenamiento en caché está deshabilitado.

7

Las dos cosas están separadas; el caché de respuesta es principalmente mirando lo que ve el cliente - lo que usarán sin tocar el servidor, o qué fecha de modificación enviarán al servidor.

OutputCache, sin embargo, está enfocado en el servidor ; la solicitud seguirá siendo (a diferencia de algo almacenado en caché en el cliente), pero es posible (con suerte) que no se invoque su método: en su lugar, se devolverá la versión en caché.

Así que: es no en caché en el cliente; se realiza una solicitud HTTP y (para solicitudes dentro de 5 minutos, para el mismo id, si la memoria lo permite) la versión almacenada en caché se devuelve del servidor (por lo general, reduce la carga de IO y CPU en el servidor). ¿Tener sentido?

+2

Esto es parcialmente cierto. El [OutputCacheLocation.Any value from MSDN] (http://msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation.aspx): "El caché de salida se puede ubicar en el cliente del navegador (donde la solicitud se originó), en un servidor proxy (o cualquier otro servidor) que participe en la solicitud, o en el servidor donde se procesó la solicitud ". Entonces, ¿qué pasará con el caché del cliente en este caso? – Carvellis

Cuestiones relacionadas