如果发生异常,“Content-encoding”标头将从 HttpHandler 响应中消失

2024-03-16

我有一个自定义 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(使用前将#替换为@)

如果发生异常,“Content-encoding”标头将从 HttpHandler 响应中消失 的相关文章

随机推荐

  • jQuery ajax json 响应的长度未定义且数据不正确

    我试图获取一个在服务器端转换为 json 对象的字典对象 以及正确的内容类型标头 但由于某种原因 即使我可以访问部分数据 其他部分也不会显示up 和 jquery 中的 json 对象的长度等于 0 这是我的 jquery 调用 ajax
  • 什么是 __main__.py?

    是什么 main py文件 我应该在其中放入什么样的代码 什么时候应该有一个 通常 Python 程序是通过在命令行上命名 py 文件来运行的 python my program py 您还可以创建一个充满代码的目录或 zip 文件 并包含
  • Antlr 语法生成无效的 C# 代码

    我正在尝试使用 ANTLR 和 StringTemplate 库开发一个 C 代码生成器 AntlrWorks 可以生成 C 解析器和词法分析器文件 而不会报告任何错误 但是 c 解析器代码无效 无法在 Visual Studio 中编译
  • Celery 3.0.1 中的框架错误

    我最近从 2 3 0 升级到 Celery 3 0 1 所有任务都运行良好 很遗憾 我经常收到 帧错误 异常 我还运行主管来重新启动线程 但由于这些线程从未真正被杀死 主管无法知道 celery 需要重新启动 有没有人见过这个 2012 0
  • 在 AWS Code Pipeline 中使用 docker compose 时出错

    我正在使用 AWS Code Pipeline 部署我的 dockerized Django 应用程序 但遇到了一些 Docker 错误 error Service proxy failed to build toomanyrequests
  • 如果满足特定条件,则停止沿特定深度的 boost::depth_first_search

    我在用着BGL http boost org doc libs 1 45 0 libs graph doc table of contents html来存储我的 DAG 顶点有状态 考虑到其中一个顶点的状态发生变化 我想更新依赖顶点 我可
  • 用于格式化一系列单元格并根据 Google 电子表格中的日期插入特定文本的脚本

    我有一个规划器类型的 Google 电子表格 其中每天有 8 10 个用户添加数据 当我向单元格添加日期时 我希望对该日期之后同一行中的所有单元格进行格式化并添加类似 ENDED 的文本值 目前 我正在使用条件格式和 ArrayFormul
  • -[NSRangeException raise] 上的符号异常断点

    在 Xcode 中添加符号断点为您提供了一个示例模板 NSException raise 我想做同样的事情但是具体来说 on NSRangeException raise 原因是我想断点only关于特定数组边界异常 例如 Terminati
  • 如何使用 Traefik 进行 WebSocket 后端

    我正在尝试为 WebSocket 应用程序配置 Traefik 我只是尝试在 docker 上使用一个简单的 WS 应用程序 https hub docker com r jmalloc echo server https hub dock
  • 过滤空手道测试响应对象以获得子列表?

    鉴于此功能文件 Feature test Scenario filter response def response a a b a c a d ab e ab f ab g ac h ac i ac
  • 建模:Xml 与关系数据库

    我想知道是否有最佳实践来决定何时应使用 XML 对系统进行建模以及何时应使用关系数据库进行建模 我知道您可以将 XML 存储在数据库中 但是对系统进行建模之间存在巨大差异使用标准化数据库表并使用 XML 模式对系统进行建模 为了具体起见 假
  • 从 rpy2 传递到 R 的什么对象?

    我无法使以下代码工作 尽管我没有看到此错误在 R 中严格工作 from rpy2 robjects packages import importr from rpy2 import robjects import numpy as np f
  • R 中的 Markdown 表到数据框

    有多种方法可以将数据框转换为 Markdown 表 但是 给定 Markdown 表 如何转换回数据帧 给定一个表格 Table Header Second Header Table Cell Cell 2 Cell 3 Cell 4 或者
  • Python函数参数:元组/列表

    我的函数需要一个列表或元组作为参数 它并不真正关心它是什么 它所做的只是将其传递给另一个接受列表或元组的函数 def func arg arg is tuple or list another func x do other stuff h
  • 工厂女孩在我的开发数据库中保存记录

    我有一个非常奇怪的问题 我不知道应该去哪里找到它 我正在使用 rspec 和 Factory Girl 开发一个 Rails 3 应用程序进行测试 由于某种原因 每当我运行任何rails命令 例如 rake数据库 启动开发服务器等 时 都会
  • 如何避免 svgs 的foreignObjects 内的元素缩放?

    我想使用 svg 作为 div 元素的容器 该元素应包含多个元素 目前它看起来像这样
  • Objective-C 相当于 Java 包吗?

    Java 包的 Objective C 等价物是什么 你如何用 Objective C 来分组和组织你的课程 问题 1 Objective C 相当于 Java 包吗 Objective C 没有与 Java 包或 C 命名空间等效的东西
  • Git/GitKraken – 从备份恢复存储库后,文件模式更改为未知值 (14001)

    对 Git Kraken 还是个新手 如果逻辑板对我来说坏了 我必须从备份中恢复存储库 重新安装软件 然后在临时计算机上恢复并运行 直到我可以从商店取回原始计算机 现在我在 Gitkraken 中打开了存储库 这告诉我我的修补程序分支上有
  • 如何增加 docker build 的卷大小

    我的步骤之一Dockerfile需要10G以上的磁盘空间 确实如此 然而 所有的中间容器docker build使用 10G 卷创建 我做了什么 started dockerd with storage opt dm basesize 25
  • 如果发生异常,“Content-encoding”标头将从 HttpHandler 响应中消失

    我有一个自定义 HttpHandler 在其中手动启用输出压缩 如下所示 context Response AppendHeader Content encoding gzip context Response Filter new GZi