Итак, у меня есть собственный атрибут CompressAttribute, который настроен как глобальный фильтр в global.asax.Он использует рефлексию для проверки типа возвращаемого значения текущего метода действия и, если это «ViewResult», он сжимает выходные данные, используя GZip или Deflate.Это работает просто отлично, за исключением случаев, когда на странице выдается ошибка 500 Server.Если возникает ошибка, вместо отображения страницы ошибки .NET, я получаю кучу этого:
��������`I�% & / m� {J�J��t 100
Видимо, он пытается закодировать страницу 500 Ошибка сервера, которая вызывает проблемы.Какой лучший способ справиться с этим?
Вот код фильтра:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
MethodInfo actionMethodInfo = Common.GetActionMethodInfo(filterContext);
if (GetReturnType(actionMethodInfo).ToLower() != "viewresult") return;
HttpRequestBase request = filterContext.HttpContext.Request;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new WebCompressionStream(response.Filter, CompressionType.GZip);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new WebCompressionStream(response.Filter, CompressionType.Deflate);
}
}