为什么仅部分客户端使用分块传输编码的http响应?

3
我有一个运行在IIS 7上的asp.net mvc应用程序。我的问题是,根据客户端的不同,响应可能会被接收为“分块传输编码”(如fiddler中所见)。我无法理解的是为什么这只发生在我的一些客户端身上(即使两台计算机使用相同的浏览器(IE8)连接到同一网络上时也是如此),而并非所有人,或者反之亦然?
请问有人能向我解释一下吗?
抱歉这个更新晚了,但问题最终是由用户访问服务器的方式引起的。如果用户通过VPN连接连接到本地局域网,则代理将被绕过,否则将使用代理。这导致了两种不同的结果。

为什么这是个问题?你好像在使用MSIE8,它可以很好地处理分块和非分块响应。对于最终用户来说,响应看起来都一样——在去除块后,两种响应是相同的。你是否有依赖于分块存在的某些功能? - Piskvor left the building
我们不确定这是否是另一个问题的原因,我们的客户在获取分块响应时无法获得发布到Web应用程序的某些JavaScript文件的最新版本。我也很好奇为什么会发生这种情况。看起来在“相同”的条件下,IIS的结果是不同的,这似乎很奇怪。 - Vinblad
当我对同一个响应进行gzip压缩和分块处理时(有点特殊),我遇到了一些问题,也许这可能是个问题? - Piskvor left the building
2
让我们明确一点:您遇到了一个问题(过时的文件),并且您已经注意到几乎肯定与此无关的怪癖(有时分块,有时不分块)。 您应该将调查重点放在问题上,而不是怪癖。当响应被动态生成并且未启用输出缓冲时,响应会被分块。如果响应已被缓冲,甚至由IIS缓存,那么没有理由使用分块编码,服务器将发送内容长度标头。 - EricLaw
是的,你可能是对的,但我发现服务器的响应(据我所知,在相同的条件下)是不同的,这让我感到很奇怪。如果我排除这样的变量,我会更容易找到真正的问题所在。 - Vinblad
2个回答

2
如果您提前刷新输出流,则服务器端启用分块编码。您是否有任何特定于用户代理的代码可能会调用Flush()?

你们两个都在使用同一个版本的Fiddler吗?当使用像Fiddler这样的代理时,它将实际上向您的Web服务器发出请求,而不是浏览器。 - RickNZ
1
@RickNZ:虽然这是正确的,但这不是“X因素”。Fiddler不会干扰分块。 - EricLaw
@EricLaw,关闭Fiddler后,分块传输对我有效,但是每当我在电脑上打开它时,我会收到完整的响应。您能否指导我解决这个问题的方法?是什么原因导致的? - Vlas Bashynskyi
@VLAS,我不明白你的问题。猜测一下:你在Fiddler工具栏上按下了“Stream”或“Decode”按钮吗? - EricLaw
@EricLaw,非常感谢,那是“Stream”按钮。我正在测试一个应用程序,它会定期发送文本(使用分块编码),但只有当完全到达时才会显示文本。 - Vlas Bashynskyi
显示剩余6条评论

1

RFC 2616指出:

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

Transfer-Encoding: chunked是HTTP/1.1定义的。你的一些客户端是否使用HTTP/1.0甚至(令人发抖的)0.9?在这种情况下,服务器不能使用传输编码,因为它不是协议的一部分。

虽然大多数现代客户端都理解HTTP/1.1,但大多数客户端在使用代理时都有降级到1.0的选项(由于历史原因-一些旧代理程序存在错误的1.1实现)。因此,尽管浏览器可能理解1.1,但如果被指示,它可以请求1.0。

例如:MSIE 6+在Internet选项对话框中具有此功能-选项卡高级-HTTP 1.1设置-复选框"使用HTTP 1.1"和"通过代理连接使用HTTP 1.1"。

此外,并非所有响应都启用了分块编码 - 通常服务器在未设置Content-Length或输出缓冲区被刷新时才会启用它。

谢谢您的回复。奇怪的是,尽管使用相同的网络和IE版本(8版),问题仍然在不同的计算机之间出现。 - Vinblad
是的,我理解。我的意思是,当其中一个计算机启用这些设置,而另一个计算机禁用这些设置时,即使两台计算机都安装了相同版本的Win/IE,它们也可能表现出不同的行为。 - Piskvor left the building
谢谢您的提示,我们已经验证了设置是相同的,但问题仍然存在。 - Vinblad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接