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