gpt4 book ai didi

c# - 如果发生异常,"Content-encoding" header 将从 HttpHandler 响应中消失

转载 作者:太空狗 更新时间:2023-10-29 22:01:33 25 4
gpt4 key购买 nike

我有一个自定义的 HttpHandler,我在其中手动启用输出压缩,如下所示:

context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);

这适用于大多数请求,但是当遇到异常时,“Content-encoding” header 将从响应中消失,而压缩过滤器仍然存在。结果是错误页面是 gzip 压缩的,但浏览器没有收到表明这一事实的 header 。然后浏览器尝试将仍然压缩的数据显示为文本,即 gobbledygook .

完整的测试用例代码如下所示。尝试交替禁用压缩或不抛出异常。

谁能解释一下为什么“Content-encoding” header 消失了?

我想我可以简单地启用压缩作为处理程序所做的最后 事情,这样如果遇到异常,它永远不会到达添加压缩过滤器的位置;但是我看到的行为让我觉得是一个错误。谁能证实一下?

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

最佳答案

WebForms 应用程序上强制执行 gzip 时,我遇到了同样的事情。为了修复它,我必须清除 Global.asax.cs 中 Application_Error 方法中的过滤器

protected void Application_Error(Object sender, EventArgs e)
{
Response.Filter = null;
}

发生这种情况的原因是 b/c 在应用出现错误之前设置了过滤器。并且出于某种原因,蓝屏错误消息清除了 Content-encoding header ,但对响应过滤器没有任何作用。

关于c# - 如果发生异常,"Content-encoding" header 将从 HttpHandler 响应中消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com