我在ASP.NET MVC 3中使用gzip/deflate ActionFilterAttribute时遇到了一个有趣的问题。如果应用程序出现异常,我没有看到YSOD,而是看到了如下的一大堆乱码。
Sorry, the text you provided seems to be a garbled code that cannot be translated. Please provide a valid text to be translated.如果我删除我的
CompressAttribute
,它将按预期工作(我会看到YSOD)。因此,似乎我的异常处理(来自Elmah.Contrib.Mvc的ElmahHandleErrorAttribute
)停止了其余的过滤器,包括CompressAttribute
,并且响应未被压缩。
相关代码:
public sealed class CompressAttribute : ActionFilterAttribute
{
private const string _acceptEncodingHeader = "Accept-Encoding";
private const string _contentEncodingHeader = "Content-Encoding";
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
string acceptEncoding = request.Headers[_acceptEncodingHeader];
if (String.IsNullOrEmpty(acceptEncoding))
{
return;
}
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader(_contentEncodingHeader, "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader(_contentEncodingHeader, "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}
过滤器注册:
GlobalFilterCollection filters = GlobalFilters.Filters;
filters.Add(new ElmahHandleErrorAttribute(), 999); // Elmah.Contrib.Mvc
filters.Add(new CompressAttribute());
如何确保响应在抛出异常时仍然可读?