【问题标题】:Why doesn't IIS support chunked transfer encoding?为什么 IIS 不支持分块传输编码?
【发布时间】:2010-09-25 05:09:50
【问题描述】:

我正在与 IIS Web 服务器建立 HTTP 连接,并发送 POST 请求,其中包含使用 Transfer-Encoding: chunked 编码的数据。当我这样做时,IIS 只是关闭连接,没有错误消息或状态代码。根据HTTP 1.1 spec

所有 HTTP/1.1 应用程序必须能够接收和解码“分块”传输编码

所以我不明白为什么 (a) 不处理该编码并且 (b) 它不发回状态码。如果我将请求更改为发送 Content-Length 而不是 Transfer-Encoding,则查询会成功,但这并不总是可能的。

当我对 Apache 尝试相同的操作时,我收到“需要 411 长度”状态和一条消息“禁止分块传输编码”。

为什么这些服务器不支持这种编码?

【问题讨论】:

    标签: apache http iis chunked-encoding


    【解决方案1】:

    这个命令来救我了!

    C:\Windows\System32\Inetsrv\Appcmd.exe 设置配置-section:httpCompression
    -[name='gzip'].staticCompressionLevel:9 -[name='gzip'].dynamicCompressionLevel:4

    拯救了我的一天...希望它可以帮助像我这样的人!

    【讨论】:

    • 我看不出启用压缩与处理分块请求有什么关系。投反对票。
    【解决方案2】:

    它是双向的。尝试将图像 2MB++ 上传到 photobucket 并记录它。他们的上传者将分块上传到他们的 apache 服务器。

    【讨论】:

      【解决方案3】:

      看看你的客户。

      IIS 和 Apache 都支持使用分块传输编码的 POST 请求。您可以使用curl utility 验证这一点:

      curl <upload-url> --form "upfile=@<local_file>" --header "Transfer-Encoding: chunked"
      

      使用Wireshark验证传输是否分块

      【讨论】:

        【解决方案4】:

        我唯一的猜测是他们出于安全考虑没有实施它。在一个简单的解决方案中,很容易通过启动多个永不结束的分块传输来设置 DOS 攻击。一个可以解释 DOS 攻击的复杂解决方案可能不值得付出努力。

        当然我不能代表 Apache 或 IIS,不过您可以直接联系 Apache 团队:http://httpd.apache.org/bug_report.html

        我同意 MarkR 的观点,我一直认为分块编码只能用作响应,但文档确实让它听起来像是可以在请求或响应中使用。

        【讨论】:

        • 客户端可以使用分块编码。这是 RFC2616 允许的。例如在文件上传场景中很有用。
        • 您可以轻松设置类似的 DOS 攻击,而无需分块编码。声明内容长度为 1,但从不发送正文。完毕。我认为与分块的区别在于它不需要内容长度标头,因此您可以流式传输未知长度的数据,这些数据通过关闭连接而终止。 IIS 通过最大请求长度和请求超时来防止这些问题。
        【解决方案5】:

        我的理解是分块编码只能用于 HTTP 响应。分块的请求正文将具有与 1.0 服务器不兼容的属性,并且在任何情况下,用户代理在发送请求之前都无法知道服务器是 1.0 服务器。

        但我同意文档中并不清楚。

        【讨论】:

        • 客户端可以通过发送 HEAD 请求等方式询问服务器。阅读 RFC 2616,第 3.6 节指出,服务器在接收到它不理解的传输编码标头时必须发送 501 响应。第 3.6.1 节说所有 HTTP 1.1 应用程序必须能够接收和解码分块传输编码。所以对我来说似乎很清楚 - 客户端到服务器的通信可以分块。一个常见的场景是文件上传。
        • 原始发布者没有提到他们使用的是哪个版本的 IIS,但 IIS 7 肯定支持传入的分块数据 - 我有一个 C++ 应用程序将请求作为分块数据发送到 IIS 7,没有任何问题
        • 我认为你不正确。服务器和客户端应该支持分块(但这并不意味着他们支持)。您认为会导致不兼容的推理是无效的,因为任何支持 http1.1 的客户端也应该了解如何与 http1.0 服务器通信。参见:jmarshall.com/easy/http/#http1.1s3 和:atnan.com/2008/8/8/transfer-encoding-chunked-chunky-http 和:w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6(也见第 3.6.1 节)
        • 我认为向 HTTP 1.0 服务器发送分块请求的客户端已损坏;如果客户端在向它发送任何内容之前(通过魔术?)可以知道服务器支持 HTTP 1.1,那么它可以发送分块请求。一些客户端查看对先前请求的响应来决定服务器是否支持 1.1,我想这在大多数情况下是有效的(尽管仍然是可疑的行为)。
        • 拒绝投票,HTTP 1.1 标准规定请求响应支持分块传输编码。
        猜你喜欢
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        • 2012-11-02
        相关资源
        最近更新 更多