因此,我有一个名为CompressAttribute的自定义属性,它在global.asax中设置为全局筛选器。它使用反射来检查当前操作方法的返回类型,如果是"ViewResult“,则使用GZip或Deflate压缩输出。它工作得很好,除非一个页面抛出了一个500Server错误。如果遇到错误,我得到的不是.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);
}
}发布于 2010-12-29 02:38:58
好的,我可以通过清除Application_Error事件中的Response.Filter属性来解决这个问题:
public void Application_Error(object sender, EventArgs e)
{
Response.Filter.Dispose();
}想知道有没有更正确的方法...
发布于 2012-03-15 17:43:35
您也可以通过附加到OnResultExecuting而不是OnActionExecuting来解决此问题。这提供了一些优势
在不求助于reflection.
OnResultExecuting的情况下,您可以发现操作结果在异常情况下不会执行(MVC将调用OnException,但不调用如下所示:
public sealed class MyAttribute : ActionFilterAttribute
{
/// <summary>
/// Called by MVC just before the result (typically a view) is executing.
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var result = filterContext.Result;
if (result is ViewResultBase)
{
var response = filterContext.HttpContext.Response;
// Check your request parameters and attach filter.
}
}发布于 2014-09-03 22:46:49
如果已经向输出中写入了任何内容,则接受的答案将不起作用。
您可以确保在适当的位置持久化消息头,而不是处理过滤器:
protected void Application_PreSendRequestHeaders()
{
// ensure that if GZip/Deflate Encoding is applied that headers are set
// also works when error occurs if filters are still active
HttpResponse response = HttpContext.Current.Response;
if (response.Filter is GZipStream && response.Headers["Content-encoding"] != "gzip")
response.AppendHeader("Content-encoding", "gzip");
else if (response.Filter is DeflateStream && response.Headers["Content-encoding"] != "deflate")
response.AppendHeader("Content-encoding", "deflate");
}https://stackoverflow.com/questions/4548221
复制相似问题