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

Posted

技术标签:

【中文标题】使用 Compression ActionFilter,服务器错误消息会清除内容编码标头并呈现为乱码【英文标题】:With Compression ActionFilter, Server error messages clears content-encoding header and renders as gibberish 【发布时间】:2009-11-03 15:44:21 【问题描述】:

当我使用压缩过滤器并出现错误时,错误页面只是乱码。问题似乎是当 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);
        
    

还有其他人经历过这种情况吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

这让我沮丧了几个月,但我让 ELMAH 看到真正的错误而不是胡言乱语,很高兴终于把它修好了 :)

以上是关于使用 Compression ActionFilter,服务器错误消息会清除内容编码标头并呈现为乱码的主要内容,如果未能解决你的问题,请参考以下文章

使用 vb.net 和 System.IO.Compression (.Net 4.5) 压缩文件

ASP.NET VNext 完整 CLR 中的 System.IO.Compression

使用 System.IO.Compression 压缩 Windows 10 Documents 文件夹,不包括重解析点

我没有在“System.IO.Compression”命名空间中找到“ZipFile”类

向 IO.Compression.ZipArchiveEntry 添加大文件会引发 OutOfMemoryException 异常

HadoopHadoop IO之Compression和Codecs