ASP.NET MVC - 在RegisterGlobalFilters使用ActionFilte

2019-07-20 11:36发布

我想用G-ZIP在我的网站,我GOOGLE了下面的代码:

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (!string.IsNullOrEmpty(acceptEncoding))
        {
            acceptEncoding = acceptEncoding.ToLower();
            var response = filterContext.HttpContext.Response;
            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);
            }
        }
    }
}

当我的属性设置为一个Controller或Action它工作正常。

[Compress]
public class PostController : Controller

我不想manully做到这一点对每一段代码,所以我注册了这个属性

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new CompressAttribute());
}

但是,当我运行应用程序,例外来到此行的代码:

response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);

该response.Filter为空。

我想知道为什么发生这种情况,如何解决这个问题。 谢谢!

-更新:

我发现,在发生异常时,只有当控制器包含一个孩子的行动,并且它被调用。

Answer 1:

我的解决办法来过滤所有子行动。

if (filterContext.IsChildAction) return;

你的方法顶部使用该代码。

public class CompressAttribute : ActionFilterAttribute
{    
   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
       if (filterContext.IsChildAction) return;

       ...
    }
}


文章来源: ASP.NET MVC - Response.Filter is null when using ActionFilterAttribute in RegisterGlobalFilters()