我有一个自定义 HttpHandler ,我在其中手动启用输出压缩,如下所示:
context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
这适用于大多数请求,但是当遇到异常时,“Content-encoding”标头会从响应中消失,而压缩过滤器仍然存在。结果是错误页面被 gzip 压缩,但浏览器没有收到表明这一事实的标题。然后浏览器尝试将仍然压缩的数据显示为文本,即gobbledygook。
完整的测试用例代码如下所示。尝试交替禁用压缩或不引发异常。
谁能解释为什么“内容编码”标题消失了?
我想我可以简单地启用压缩作为处理程序所做的最后一件事,这样如果遇到异常,它就永远不会到达添加压缩过滤器的位置;但我看到的行为让我觉得是个错误。任何人都可以确认吗?
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; }
}
}
编辑:我在测试用例中看到的静止编码响应的屏幕截图:http: //i.imgur.com/49Vcl.png