2008-12-03 89 views
7

我正在与IIS Web服务器建立HTTP连接,并发送带有使用Transfer-Encoding编码的数据的POST请求:分块。当我这样做时,IIS只是关闭连接,没有错误消息或状态码。按照HTTP 1.1 spec为什么IIS不支持分块传输编码?

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

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

当我对Apache尝试同样的事情时,我得到一个“411 Length Required”状态和一条消息,表示“chunked Transfer-Encoding forbidden”。

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

回答

4

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

但我同意从文档不清楚。

+3

客户端可以通过发送HEAD请求等来询问服务器。阅读RFC 2616第3.6节指出,服务器在收到它不理解的传输编码头时必须发送501响应。 3.6.1节说,所有HTTP 1.1应用程序必须能够接收和解码分块传输编码。所以对我来说似乎很清楚 - 客户端到服务器的通信可以被分块。常见的情况是文件上传。 – Cheeso 2009-07-06 14:49:37

+1

原始海报没有提及它们使用的是哪个版本的IIS,但IIS 7明确支持传入的分块数据 - 我有一个C++应用程序将请求作为分块数据发送到IIS 7,没有任何问题 – 2010-11-30 18:43:34

+1

我认为你不正确。服务器和客户端应该支持分块(这并不意味着它们可以)。你认为不兼容会导致无效,因为任何支持http1.1的客户端也应该知道如何与http1.0服务器通信。请参阅:http://www.jmarshall.com/easy/http/#http1.1s3和:http://www.atnan.com/2008/8/8/transfer-encoding-chunked-chunky-http和:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6(也可参阅第3.6.1节) – 2011-02-17 23:58:03

-1

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

当然我不能为Apache或IIS可言,您可以直接虽然到Apache团队联系:http://httpd.apache.org/bug_report.html

我MarkR,我一直以为块编码只能作为一个部门的回应同意,但文档确实使它听起来像可以用于请求或响应。

7

看看你的客户。

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

curl <upload-url> --form "[email protected]<local_file>" --header "Transfer-Encoding: chunked" 

验证传输使用Wireshark

2

它是双向的分块。尝试上传一张图片2MB ++到photobucket并记录下来。他们的上传器上传到他们的apache服务器。

-1

这个命令来救我!

C:\ Windows \ System32下\ INETSRV \ Appcmd.exe的设置配置-section:httpCompression
- [名称= '的gzip'] staticCompressionLevel:9 - [名称= '的gzip'] dynamicCompressionLevel:4

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