【问题标题】:setting Transfer-Encoding header not working with no error message设置 Transfer-Encoding 标头不起作用,没有错误消息
【发布时间】:2013-08-20 09:27:06
【问题描述】:

我通过在我的页面中间调用Response.Flush() 将页面分块发送给客户端。这样浏览器将获取 html 的第一部分,并可以在我的服务器继续处理请求的其余部分时开始下载资源。

由于我的 IIS 服务器和我的客户端(CDN、防火墙、负载平衡等)之间的某些第 3 方服务,我需要设置标头 Transfer-Encoding: Chunked,以便他们知道响应将以块的形式返回。

我尝试通过调用设置标题:Response.Headers.Add("Transfer-Encoding", "chunked");

由于某种原因,当我这样做时,我在等待很长时间后返回一个空白页面,即使直接联系我的 IIS 服务器,也没有经过所有第 3 方。附加到要调试的进程时,我没有看到任何错误。
删除“Transfer-Encoding”标头有效,但我需要此标头用于我正在使用的某些第 3 方。

任何人都知道如何在我的网络应用程序中设置此标头??

顺便说一句 - 我也尝试直接在 IIS 的“响应标头”部分设置此标头,但这样做时响应仍然为空。

【问题讨论】:

  • 似乎分块传输编码需要数据以特定格式编码。您的问题不清楚您是否执行了这种编码。你 ? en.wikipedia.org/wiki/Chunked_transfer_encoding
  • @jbl - 谢谢!我对此进行了进一步调查,并意识到在 asp.net 中调用Response.Flush() 不幸的是,它不会以使用标头Transfer-Encoding: chunked 所需的格式输出数据。响应已发送,但浏览器不知道如何分析它。如果您将此添加为正确答案,我将奖励您赏金!
  • 完成。谢谢后续!
  • @jbl - 不客气!感谢您的回答,我为此看了一段时间。 :)

标签: c# asp.net asp.net-mvc iis-7 iis-7.5


【解决方案1】:

根据the description on Wikipedia,分块传输编码要求以特定方式对响应正文进行编码,所述格式的要点之一是:

每个块都以其嵌入的数据的八位字节数开始 以 ASCII 格式的十六进制数表示,后跟可选 参数(块扩展)和终止 CRLF 序列,随后 由块数据。该块由 CRLF 终止。如果块 提供了扩展,块大小以分号结尾 后跟扩展名和可选的等号和值。

据我所知,调用Response.Flush() 不会生成此特定标记。它只是将所有缓冲的响应内容清空给客户端。

您可以查看“服务器何时使用分块传输编码?”在这个答案中: https://stackoverflow.com/a/2711405/1236044

这似乎暗示,如果设置正确,IIS 应该在需要时自动切换到块传输编码

【讨论】:

    【解决方案2】:

    如果您禁用缓冲,服务器将使用分块传输编码:

    将context.Response.BufferOutput 设置为false

    According to this question

    您可能还需要设置Server.ScriptTimeout(以秒为单位)以避免您的脚本被中断。

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 2011-11-09
      • 2017-10-03
      • 2020-04-17
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多