我有一个自定义 HttpHandler,在其中手动启用输出压缩,如下所示:
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
这对于大多数请求来说效果很好,但是当遇到异常时,“Content-encoding”标头将从响应中消失,而压缩过滤器仍然存在。结果是错误页面是 gzip 压缩的,但浏览器没有收到表明这一事实的标头。然后浏览器尝试将仍然压缩的数据显示为文本,即官样书 https://i.stack.imgur.com/R3Wmq.png.
完整的测试用例代码如下所示。尝试交替禁用压缩或不引发异常。
任何人都可以解释为什么“内容编码”标头消失吗?
我想我可以简单地启用压缩last处理程序所做的事情,因此如果遇到异常,它永远不会到达添加压缩过滤器的位置;但我所看到的行为让我觉得这是一个错误。有人能证实吗?
public class TestHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
CompressResponse(context);
context.Response.Write("Hello world");
// Throw an exception for testing purposes
throw new Exception("Just testing...");
}
private void CompressResponse(HttpContext context)
{
string acceptEncoding = context.Request.Headers["Accept-Encoding"];
if (String.IsNullOrEmpty(acceptEncoding))
{
return;
}
// gzip or wildcard
if (acceptEncoding.ToLower().Contains("gzip") || acceptEncoding.Contains("*"))
{
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
return;
}
// Also handles deflate (not shown here)
// <snip>
}
public bool IsReusable
{
get { return true; }
}
}
编辑:我在测试用例中看到的仍然编码的响应的屏幕截图:https://i.stack.imgur.com/R3Wmq.png https://i.stack.imgur.com/R3Wmq.png
当我强制 gzip 时,也发生了同样的事情WebForms应用。为了解决这个问题,我必须清除过滤器应用程序错误Global.asax.cs 中的方法
protected void Application_Error(Object sender, EventArgs e)
{
Response.Filter = null;
}
发生这种情况的原因是 b/c 在应用程序出现错误之前设置了过滤器。由于某种原因,黄屏错误消息会清除内容编码标头,但不会对响应过滤器执行任何操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)