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