ASP.NET MVC – Response.Filter is null when using ActionFilterAttribute in RegisterGlobalFilters()

I want to use G-ZIP on my website, I googled the following code:

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

It works fine when I set the attribute to a Controller or an Action.

[Compress]
public class PostController : Controller

I don’t want to manully do this on every piece of code, so I registered this attribute in

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

But when I run the application, exception came on this line of code:

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

the response.Filter is null.

I want to know why this is happening and how to solve this. Thanks!

– Update:

I found that the exception happens only when the controller contains a child action, and it’s being invoked.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

My solution was to filter all child action.

if (filterContext.IsChildAction) return;

Use this code on the top of your method.

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

       ...
    }
}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x