Sto cercando di ottenere [CompressFilter] lavorando con caching ciambella e in esecuzione in problemi.Posso usare [CompressFilter] in ASP.NET MVC senza rompere la ciambella ciambella
Quello che succede è che l'intera pagina viene memorizzata nella cache e non solo la ciambella. La fonte per il CompressFilter
che sto usando è sotto. L'ho modificato da original source per utilizzare OnResultExecuted
anziché OnActionExecuting()
perché avevo bisogno di accedere al tipo di risultato per evitare di memorizzare nella cache alcune sottoclassi ActionResult.
Guardando il vero codice sorgente MVC v1 per OutputCacheAttribute
sembra che stia usando anche OnResultExecuted()
, ma non penso che il fatto stia causando il conflitto direttamente.
Non so abbastanza su come la cache sostitutiva funzioni per capire esattamente perché si comporta come fa. Penso che sia degno di nota dire che questo non finisce con nessun tipo di display corrotto. Si comporta semplicemente come non c'è ciambella!
Sembra che dovrò usare un qualche tipo di plug-in di II per gestire il caching, che volevo davvero evitare di dover fare, ma sembra che abbia bisogno anche del caching in ciambella.
In questo momento sono più interessato a sapere perché ha questo effetto, ma una soluzione, se possibile, sarebbe anche ottima.
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 per affermare che si è guardato attraverso il codice sorgente. –
@jordan, grazie! Vorrei solo che non mi ci fosse voluto un'ora per capire che lo stupido [CompressFilter] era ciò che era in conflitto. Stavo controllando tutto il resto possibile come una causa per il caching della ciambella in mancanza e vorrei davvero che questo non fosse stato il problema –
+1 per avermi indirizzato a questo utile filtro. Grazie! – jao