"Content-encoding" заголовок исчезает из ответа HttpHandler, если происходит исключение

У меня есть собственный 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

6
задан David Mills 13 January 2012 в 02:03
поделиться