首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 3压缩过滤器导致输出乱码

MVC 3压缩过滤器导致输出乱码
EN

Stack Overflow用户
提问于 2010-12-29 02:06:30
回答 4查看 3K关注 0票数 17

因此,我有一个名为CompressAttribute的自定义属性,它在global.asax中设置为全局筛选器。它使用反射来检查当前操作方法的返回类型,如果是"ViewResult“,则使用GZip或Deflate压缩输出。它工作得很好,除非一个页面抛出了一个500Server错误。如果遇到错误,我得到的不是.NET错误页面,而是一堆这样的内容:

��������`I�%&/m�{J�J��t��

显然,它试图编码500服务器错误页面,这是导致问题的原因。处理这个问题的最好方法是什么?

下面是过滤器代码:

代码语言:javascript
复制
public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            MethodInfo actionMethodInfo = Common.GetActionMethodInfo(filterContext);
            if (GetReturnType(actionMethodInfo).ToLower() != "viewresult") return;

            HttpRequestBase request = filterContext.HttpContext.Request;

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

            if (string.IsNullOrEmpty(acceptEncoding)) return;

            acceptEncoding = acceptEncoding.ToUpperInvariant();

            HttpResponseBase response = filterContext.HttpContext.Response;

            if (acceptEncoding.Contains("GZIP"))
            {
                response.AppendHeader("Content-encoding", "gzip");
                response.Filter = new WebCompressionStream(response.Filter, CompressionType.GZip);
            }
            else if (acceptEncoding.Contains("DEFLATE"))
            {
                response.AppendHeader("Content-encoding", "deflate");
                response.Filter = new WebCompressionStream(response.Filter, CompressionType.Deflate);
            }
        }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-29 02:38:58

好的,我可以通过清除Application_Error事件中的Response.Filter属性来解决这个问题:

代码语言:javascript
复制
public void Application_Error(object sender, EventArgs e)
{
    Response.Filter.Dispose();
}

想知道有没有更正确的方法...

票数 21
EN

Stack Overflow用户

发布于 2012-03-15 17:43:35

您也可以通过附加到OnResultExecuting而不是OnActionExecuting来解决此问题。这提供了一些优势

在不求助于reflection.

  • OnResultExecuting的情况下,您可以发现操作结果在异常情况下不会执行(MVC将调用OnException,但不调用

如下所示:

代码语言:javascript
复制
public sealed class MyAttribute  : ActionFilterAttribute
{
    /// <summary>
    /// Called by MVC just before the result (typically a view) is executing.
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var result = filterContext.Result;
        if (result is ViewResultBase)
        {
            var response = filterContext.HttpContext.Response;

            // Check your request parameters and attach filter.
        }
    }
票数 7
EN

Stack Overflow用户

发布于 2014-09-03 22:46:49

如果已经向输出中写入了任何内容,则接受的答案将不起作用。

您可以确保在适当的位置持久化消息头,而不是处理过滤器:

代码语言:javascript
复制
 protected void Application_PreSendRequestHeaders()
{
    // ensure that if GZip/Deflate Encoding is applied that headers are set
    // also works when error occurs if filters are still active
    HttpResponse response = HttpContext.Current.Response;
    if (response.Filter is GZipStream && response.Headers["Content-encoding"] != "gzip")
        response.AppendHeader("Content-encoding", "gzip");
    else if (response.Filter is DeflateStream && response.Headers["Content-encoding"] != "deflate")
        response.AppendHeader("Content-encoding", "deflate");
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4548221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档