在asp.net MVC中,CompressFilter与ExceptionHandlerFilter存在冲突。

6

当我在操作上使用了CompressFilter且出现错误时,我的ExceptionHandling没有被触发。请求没有返回任何响应。如果我移除Compress filter,那么它会正常返回错误数组。如何跳过压缩过滤器并让其第二次触发?

控制器操作

 [HttpPost, CompressAttribute]
 public virtual ActionResult Builder()

Global.asax

GlobalConfiguration.Configuration.Filters.Add(new ExceptionHandlingAttribute());

CompressFilter

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class CompressAttribue : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
                var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
                if (string.IsNullOrEmpty(encodingsAccepted)) return;

                encodingsAccepted = encodingsAccepted.ToLowerInvariant();
                var response = filterContext.HttpContext.Response;

                if (encodingsAccepted.Contains("gzip"))
                {
                    response.AppendHeader("Content-encoding", "gzip");
                    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                }
                else if (encodingsAccepted.Contains("deflate"))
                {
                    response.AppendHeader("Content-encoding", "deflate");
                    response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                }
        }
    }

压缩是与错误滤波器何时添加相关的? - Nkosi
更新并添加了问题 - Mike Flynn
你检查过这个吗?https://dev59.com/zmDVa4cB1Zd3GeqPdW0D - MonkeyDLuffy
1个回答

3

我把它移到了OnActionExecuted,因为它包含一个异常属性,所以它可以正常工作。

public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);

            if (filterContext.Exception == null)
            {
                var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
                if (!encodingsAccepted.IsBlank())
                {
                    encodingsAccepted = encodingsAccepted.ToLowerInvariant();
                    var response = filterContext.HttpContext.Response;

                    if (encodingsAccepted.Contains("gzip"))
                    {
                        response.AppendHeader("Content-encoding", "gzip");
                        response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                    }
                    else if (encodingsAccepted.Contains("deflate"))
                    {
                        response.AppendHeader("Content-encoding", "deflate");
                        response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                    }
                }
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接