【发布时间】:2010-12-28 18:06:29
【问题描述】:
所以,我有一个名为 CompressAttribute 的自定义属性,它在 global.asax 中设置为全局过滤器。它使用反射来检查当前操作方法的返回类型,如果是“ViewResult”,它会使用 GZip 或 Deflate 压缩输出。它工作得很好,除非页面抛出 500 服务器错误。如果遇到错误,而不是显示 .NET 错误页面,我会得到一堆这样的:
��������`I�%&/m�{J�J��t��
显然它正在尝试对导致问题的 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);
}
}
【问题讨论】:
标签: c# asp.net-mvc action-filter