繁体   English   中英

ASP.NET MVC-在RegisterGlobalFilters()中使用ActionFilterAttribute时Response.Filter为null

[英]ASP.NET MVC - Response.Filter is null when using ActionFilterAttribute in RegisterGlobalFilters()

我想在我的网站上使用G-ZIP,我用谷歌搜索了以下代码:

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

我不想在每段代码上都手动执行此操作,因此我在

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

但是,当我运行该应用程序时,以下代码行出现了异常:

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

response.Filter为null。

我想知道为什么会这样以及如何解决这个问题。 谢谢!

-更新:

我发现只有在控制器包含一个子动作并对其进行调用时,才会发生该异常。

我的解决方案是过滤所有子动作。

if (filterContext.IsChildAction) return;

在您的方法顶部使用此代码。

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

       ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM