У меня есть собственный HttpHandler, в котором я вручную включаю сжатие вывода, как показано ниже:
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
Это хорошо работает для большинства запросов, но когда возникает исключение, заголовок "Content-encoding" исчезает из ответа, а фильтр сжатия остается на месте. В результате страница ошибки сжимается gzip, но браузер не получает заголовка, указывающего на этот факт. Затем браузер пытается отобразить все еще сжатые данные в виде текста, что приводит к gobbledygook.
Полный код тестового примера показан ниже. Попробуйте попеременно отключать сжатие или не выбрасывать исключение.
Может ли кто-нибудь пролить свет на то, почему исчезает заголовок "Content-encoding"?
Полагаю, я мог бы просто включить сжатие как последнее действие обработчика, чтобы при возникновении исключения оно не доходило до точки, где добавляется фильтр сжатия; но поведение, которое я наблюдаю, кажется мне ошибкой. Кто-нибудь может подтвердить?
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)
//
}
public bool IsReusable
{
get { return true; }
}
}
EDIT: Скриншот все еще закодированного ответа, который я вижу в моем тестовом примере: http://i.imgur.com/49Vcl.png