net mvc example enable cache asp c# asp.net-mvc outputcache

c# - example - ASP.NET MVC OutputCache varía según*y varía según la cookie del usuario



outputcache mvc 5 (3)

Tengo un proyecto asp.net mvc 3 y tengo un controlador doméstico. He etiquetado mi acción de índice con este atributo:

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

El cambio según la costumbre con el usuario se maneja en Global.asax.cs para verificar el valor de la cookie del usuario para que el almacenamiento en caché cambie en función de si el usuario ha iniciado sesión o no y de qué usuario es.

Cuando voy a esta página en mi servidor web, obtengo estos encabezados 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

Desde el principio, el valor Vary - Accept-Encoding se ve mal, ¿no debería haber enviado un Vary - * en su lugar?

También estoy representando la propiedad User.Identity.Name en esta vista y me doy cuenta de que, incluso cuando cierre la sesión, seguirá mostrando 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); }

Jugando con esto por varias horas, y estoy completamente atascado, espero que alguien tenga una idea ...


El problema fue la compresión dinámica IIS. Falsea los encabezados http. Lo resolví rodando mi propia compresión dinámica utilizando un filtro de acción.


Hay un HotFix de Microsoft para esto, pero no le permitirán simplemente descargar el hotfix.

Tienes que rellenar tu correo electrónico para que te lo envíen 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 de la computadora que recibirá la revisión antes de instalar la revisión".

Por lo que puedo ver crea los siguientes problemas.

  • No hay desinstalación
  • Requiere un reinicio
  • La última fecha de modificación se actualiza para cada solicitud, incluso si devuelve la 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

¡Así que piensa cuidadosamente antes de instalar esto!


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

Extracto, de la referencia de configuración de IIS , sobre el atributo dynamicCompressionBeforeCache:

El atributo dynamicCompressionBeforeCache especifica si IIS comprime dinámicamente el contenido que no se ha almacenado en caché. Cuando el atributo dynamicCompressionBeforeCache es verdadero , 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 las solicitudes posteriores. Cuando dynamicCompressionBeforeCache es falso , IIS devuelve la respuesta sin comprimir hasta que la respuesta comprimida se haya agregado al directorio de caché.