que estoy tratando de conseguir [CompressFilter] trabajar con el almacenamiento en caché donut y se produzcan problemas.¿Puedo usar [CompressFilter] en ASP.NET MVC sin romper el almacenamiento en caché de rosquilla
Lo que pasa es que toda la página se almacena en caché y no sólo la rosquilla. La fuente para el CompressFilter
que estoy usando está debajo. He cambiado esto desde el original source utilizar OnResultExecuted
en lugar de OnActionExecuting()
porque necesitaba acceso al tipo del resultado de evitar el almacenamiento en caché ciertas subclases ActionResult.
Mirando el código fuente MVC v1 real para OutputCacheAttribute
parece que también está usando OnResultExecuted()
, pero no creo que ese hecho esté causando el conflicto directamente.
No sé lo suficiente sobre cómo el almacenamiento en caché de sustitución trabaja para entender muy bien por qué se comporta como lo hace. Creo que es notable decir que esto no termina con ningún tipo de pantalla corrupta. ¡Simplemente se comporta como si no hubiera donuts!
Parece que tendré que usar algún tipo de plug-in II para manejar el almacenamiento en caché, lo cual realmente quería evitar tener que hacer, pero parece que también necesito el caché de donuts.
realidad estoy más interesado en este momento para saber por qué tiene este efecto, sino una solución si es posible sería grande también.
public class CompressFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
// dont encode images!
if (filterContext.Result is ImageResult)
{
return;
}
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}
+1 para que indique que ha mirado a través del código fuente. –
@jordan gracias! solo desearía que no me hubiera tomado una hora darme cuenta de que el estúpido [CompressFilter] era lo que estaba en conflicto. Estaba comprobando todo lo demás posible como una causa para el almacenamiento en caché del buzón y realmente me hubiera gustado que este no hubiera sido el problema –
+1 por señalarme este útil filtro. ¡Gracias! – jao