ASP.NET MVC - Response.Filter имеет значение null при использовании ActionFilterAttribute в 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);
ответ. Фильтр пуст.
Я хочу знать, почему это происходит и как это решить. Спасибо!
- Обновить:
Я обнаружил, что исключение происходит только тогда, когда контроллер содержит дочернее действие, и оно вызывается.