С помощью Compression ActionFilter сообщения об ошибках сервера очищают заголовок заголовка содержимого и отображаются как тарабарщина

Когда я использую фильтр сжатия и получаю сообщение об ошибке, страница с ошибкой - это просто тарабарские символы. Проблема заключается в том, что при переходе IIS на страницу с ошибкой фильтр сжатия по-прежнему действует, но заголовки очищаются. Без заголовка "Content-encoding: gzip" браузер просто отображает необработанные двоичные данные gzipped.

Я использую IIS7.5, ASP.NET MVC 2 Preview 2 и ActionFilter, который выглядит следующим образом:

public class CompressResponseAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
        var response = filterContext.HttpContext.Response;

        var acceptEncoding = request.Headers["Accept-Encoding"];

        if (string.IsNullOrEmpty(acceptEncoding))
            return;

        acceptEncoding = acceptEncoding.ToLowerInvariant();

        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

Update: Я наткнулся на сообщение Rick Strahl по этой и другим проблемам с сжатием. Глянь сюда: http://www.west-wind.com/weblog/posts/2011/May/02/ASPNET-GZip-Encoding-Caveats

Его решение, которое кажется более надежным, заключается в следующем: Global.asax.cs:

protected void Application_Error(object sender, EventArgs e)
{
    // Remove any special filtering especially GZip filtering
    Response.Filter = null;
}

Оригинальный ответ: Я исправил это, применяя сжатие в OnResultExecuting вместо OnActionExecuting.