问题 使用Compression ActionFilter,服务器错误消息会清除内容编码标头并呈现为乱码


当我使用压缩过滤器并获得错误时,错误页面只是乱码字符。问题似乎是当IIS转移到错误页面时,压缩过滤器仍然有效,但标题被清除。如果没有“Content-encoding:gzip”标头,浏览器只会显示原始gzip二进制数据。

我正在使用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);
        }
    }
}

有人经历过这个吗?


10521
2017-11-03 15:44


起源



答案:


更新: 我偶然发现了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中应用压缩来解决这个问题。


11
2017-11-03 22:17



不妨将此标记为您的答案,因为它有效...... :) - Tieson T.
这让我感到沮丧几个月,但我有ELMAH看到真正的错误而不是胡言乱语,很高兴最终得到它修复:) - David Cumps


答案:


更新: 我偶然发现了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中应用压缩来解决这个问题。


11
2017-11-03 22:17



不妨将此标记为您的答案,因为它有效...... :) - Tieson T.
这让我感到沮丧几个月,但我有ELMAH看到真正的错误而不是胡言乱语,很高兴最终得到它修复:) - David Cumps