asp.net-mvc - CompressFilter 与 asp.net MVC 中的 ExceptionHandlerFilter 冲突

标签 asp.net-mvc exception-handling action-filter

当我在操作上使用 CompressFilter 并且它们是一个错误时,我没有得到我的 ExceptionHandling 命中。对请求不返回响应。如果我删除 Compress 过滤器,那么它会返回错误数组就好了。如何在出现错误时跳过压缩过滤器,或者让它第二次出现?

Controller Action

 [HttpPost, CompressAttribute]
 public virtual ActionResult Builder()

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

压缩过滤器
[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);
                }
        }
    }

最佳答案

我把它移到了 OnActionExecuted它有效,因为它包含一个 Exception 属性。

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);
                    }
                }
            }
        }

关于asp.net-mvc - CompressFilter 与 asp.net MVC 中的 ExceptionHandlerFilter 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52907329/

相关文章:

c# - 如何使用MVC在div中显示图像

c# - 为 MVC3 和 MVC4 Beta 编写自定义 HtmlHelpers,我应该使用 HtmlString 还是 MvcHtmlString?

jquery - 将 JSON 发布到 asp.net MVC Controller ,而不是 Ajax

.net - .NET 中的错误代码/消息管理方法

c++ - 覆盖 std :exception 的析构函数

c# - Razor 页面 - 尝试在 Razor 页面上实现操作过滤器

asp.net-mvc - 如何在全局级别添加 AuthorizeAttribute 并在某些操作中排除它?

javascript - 如何使用Ajax将模型发送到 Controller ,而不使用表单?

Java 异常类

asp.net-mvc - 更改 OnActionExecuting 事件中的模型