2011-03-20 6 views
19

Tengo un proyecto asp.net mvc 3 y tengo un controlador doméstico. He marcado mi acción índice con este atributo:ASP.NET MVC OutputCache varían en * y varían según la cookie del usuario

[OutputCache(Location = System.Web.UI.OutputCacheLocation.Any, Duration = 120, VaryByParam = "*", VaryByCustom = "user")] 
public ActionResult Index() 
{ 
    return View(); 
} 

La varían según la medida con que se maneja en Global.asax.cs para comprobar el valor de la cookie de usuario del usuario de modo que los cambios de almacenamiento en caché en función de si el usuario está conectado o no y qué usuario son.

Cuando voy a esta página en mi servidor web, consigo estas cabeceras en la respuesta:

Cache-Control public, max-age=120 
Content-Type text/html; charset=utf-8 
Content-Encoding gzip 
Expires Sun, 20 Mar 2011 21:50:09 GMT 
Last-Modified Sun, 20 Mar 2011 21:48:09 GMT 
Vary Accept-Encoding 
Date Sun, 20 Mar 2011 21:48:09 GMT 
Content-Length 3105 

De buenas a primeras, la Vary - valor Accept-Encoding se ve mal, ¿no debería tener envió un Vary - * en su lugar?

Estoy representando la propiedad User.Identity.Name en esta vista también y me doy cuenta de que incluso cuando cierro la sesión seguirá representando el nombre de usuario, hasta que caduquen los 120 segundos.

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom.Equals("user", StringComparison.OrdinalIgnoreCase)) 
    { 
     HttpCookie cookie = context.Request.Cookies["user"]; 
     if (cookie != null) 
     { 
      return cookie.Value; 
     } 
    } 
    return base.GetVaryByCustomString(context, custom); 
} 

estado jugando con esto durante varias horas, y estoy completamente atascado, es de esperar que alguien tiene una idea ...

Respuesta

17

Puede hacer que IIS comprima la respuesta antes de que se guarde en caché definiendo dynamicCompressionBeforeCache="true" en el elemento urlCompression en su web.config. Esto dará como resultado que se devuelva el encabezado esperado Vary:*.

Extracto, desde el IIS Configuration Reference, sobre el atributo dynamicCompressionBeforeCache:

El dynamicCompressionBeforeCache atributo especifica si IIS se comprimirá de forma dinámica el contenido que no se ha almacenado en caché. Cuando el atributo dynamicCompressionBeforeCache es true, IIS comprime dinámicamente la respuesta la primera vez que se realiza una solicitud y pone en cola el contenido para la compresión. Las solicitudes subsiguientes se sirven dinámicamente hasta que la respuesta comprimida se haya agregado al directorio de caché. Una vez que la respuesta comprimida se agrega al directorio de caché, la respuesta en caché se envía a los clientes para solicitudes posteriores. Cuando dynamicCompressionBeforeCache es false, IIS devuelve la respuesta descomprimida hasta que la respuesta comprimida se haya agregado al directorio de caché.

+0

Super que es bueno saber – jjxtra

+0

Muy buen consejo. No sé por qué es falso por defecto en IIS7.0, lo que nos lleva a un caché de resultados con errores –

4

El problema era IIS compresión dinámica. No funciona los encabezados http. Lo resolví rodando mi propia compresión dinámica usando un filtro de acción.

0

Hay una Microsoft HotFix para esto, pero no van a dejar que acaba de descargar la revisión.

Usted tiene que llenar en su correo electrónico para que envíen a usted y dice:

  • "No implemente una revisión en un entorno de producción sin probar primero la revisión."
  • "Realice una copia de seguridad del sistema o la computadora que recibirá la revisión antes de instalar la revisión."

Por lo que puedo ver que crea las siguientes cuestiones

  • No hay desinstalación
  • requiere un reinicio
  • La última fecha de modificación se actualiza para cada petición, incluso si se devuelve el versión en caché

Más información:

http://support2.microsoft.com/kb/2877816/en-gb

http://blogs.iis.net/erez/archive/2013/08/02/iis-compression-overrides-the-vary-header.aspx

https://51degrees.com/support/documentation/net/iis-modification

por lo que pensar cuidadosamente antes de instalar este!

Cuestiones relacionadas