Ho un personalizzato HttpHandler in cui è possibile attivare manualmente la compressione di uscita, in questo modo:"Content-Encoding" scompare dalla risposta HttpHandler se si verifica un'eccezione
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
Questo funziona bene per la maggior parte delle richieste, ma quando un l'eccezione si verifica quando l'intestazione "Content-encoding" scompare dalla risposta, mentre il filtro di compressione rimane sul posto. Il risultato è che la pagina di errore è compressa gzip, ma il browser non riceve alcuna intestazione che lo indichi. Il browser tenta quindi di visualizzare i dati compressi come testo, ovvero gobbledygook.
Il codice completo del test case è mostrato di seguito. Prova alternativamente a disabilitare la compressione o a non generare l'eccezione.
Qualcuno può far luce sul motivo per cui l'intestazione "Content-encoding" scompare?
Suppongo che potrei semplicemente abilitare la compressione come l'ultima cosa che il gestore lo fa, in modo che se si verifica un'eccezione non raggiunge mai il punto in cui si aggiunge il filtro di compressione; ma il comportamento che sto vedendo mi colpisce come un insetto. Qualcuno può confermare?
public class TestHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
CompressResponse(context);
context.Response.Write("Hello world");
// Throw an exception for testing purposes
throw new Exception("Just testing...");
}
private void CompressResponse(HttpContext context)
{
string acceptEncoding = context.Request.Headers["Accept-Encoding"];
if (String.IsNullOrEmpty(acceptEncoding))
{
return;
}
// gzip or wildcard
if (acceptEncoding.ToLower().Contains("gzip") || acceptEncoding.Contains("*"))
{
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
return;
}
// Also handles deflate (not shown here)
// <snip>
}
public bool IsReusable
{
get { return true; }
}
}
EDIT: Schermata della risposta ancora codificato che sto vedendo con il mio banco di prova: http://i.imgur.com/49Vcl.png
Quindi, se si esegue il mio codice così com'è, si ottiene un vero e proprio schermo giallo della morte, piuttosto che un gobbledygook ancora compresso? –
sì, così com'è, faccio copia/incolla e ottengo un vero schermo giallo di morte. Il problema si presenta quando scarico() !!!!!!!! scarichi da qualche parte prima dell'errore? Il gzip non appare, ma anche il filtro non è impostato. – Aristos
Forse da qualche altra parte hai impostato un errore personalizzato? – Aristos