【问题标题】:Why is http-response in chunked transfer-encoding only for some clients为什么分块传输编码中的 http-response 仅适用于某些客户端
【发布时间】:2009-11-19 07:14:03
【问题描述】:

我有一个在 IIS 7 上运行的 asp.net mvc 应用程序。我遇到的问题是,根据客户端的不同,响应可能会被接收(通过提琴手看到)为“分块传输编码。我不能明白为什么这只发生在我的一些客户身上(即使两台计算机在同一个网络上使用相同的浏览器(IE 8)而不是每个人,反之亦然?

谁能给我解释一下?

很抱歉更新晚了,但问题原来是用户如何到达服务器的结果。如果用户通过 vpn 连接连接到本地局域网,则将回避代理,否则将使用代理。这导致了两种不同的结果。

【问题讨论】:

  • 为什么会出现这个问题?您似乎正在使用 MSIE8,它可以很好地处理分块和非分块响应。对于最终用户来说,响应看起来是一样的——在去分块之后,两个响应将是相同的。你有一些依赖于存在的块的功能吗?
  • 不确定这是否是我们遇到的另一个问题的原因,即获得分块响应的客户端没有获得发布到 webbapplication 的某些 javascript 文件的最新版本。而且,我很好奇为什么会发生这种情况。在“相同”条件下,IIS 的结果不同,这似乎很奇怪。
  • 我在压缩和分块相同的响应时遇到了一些问题(有点极端情况),也许这可能是个问题?
  • 让我们在这里明确一点:您遇到了问题(文件过时),并且您已经注意到几乎可以肯定是不相关的怪癖(有时是分块,有时不是)。您应该将调查重点放在问题上,而不是怪癖上。当动态生成响应并且未启用输出缓冲时,响应会被分块。如果响应已被 IIS 缓冲,甚至缓存,则没有理由使用 Chunked Encoding,服务器将改为发送 content-length 标头。
  • 是的,您可能是对的,但我发现服务器的响应(据我所知在相同条件下)不同,这很奇怪。如果我消除这些变量,我发现更容易找到真正的问题。

标签: asp.net-mvc iis-7 fiddler chunked-encoding


【解决方案1】:

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

【讨论】:

  • 我不明白为什么客户之间的结果不同。我旁边的同事在同一网络上使用相同类型的计算机并没有收到以分块格式发送给他的响应(两者都使用 IE 8),而我却收到了。两者都使用具有相同脚本和相同网页的相同网站。如果在服务器上启用了分块编码,是否意味着所有响应都以分块形式发送?
  • 你们使用的是同一个版本的 Fiddler 吗?当使用像 Fiddler 这样的代理时,它实际上是向您的网络服务器发出请求,而不是浏览器。
  • @RickNZ:虽然这是真的,但这不是这里的“x 因素”。 Fiddler 不会干扰分块。
  • 你好埃里克劳!响应头的区别是这样的。当分块 Header.Miscellaneous.Server: mc (其中 MC 可能是 IIS 中的子域名)。当没有对 Header.Miscellaneous.Server 进行分块时:Microsoft-IIS/7.0 这是我能看到的唯一区别(除了前面提到的)。
  • @RickNZ:EricLaw 是优秀 Fiddler 的创造者,所以他可能知道它做什么或不做什么;)无论如何,如果你想最小化观察者效应,试着从网络上捕获你的流量,例如与 Wireshark。虽然用起来有点难,但是是被动捕获,所以不影响流量。
【解决方案2】:

RFC 2616 says:

所有 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 选项对话框中有此选项 - 选项卡 Advanced - HTTP 1.1 settings - 复选框“Use HTTP 1.1”和“Use HTTP 1.1 through proxy connections”。

此外,不会为所有响应激活分块编码 - 通常当未设置 Content-Length 或刷新输出缓冲区时,服务器会打开它。

【讨论】:

  • 感谢您的回复。奇怪的是,即使使用相同的网络和相同版本的 IE(版本 8)。问题出现在不同的计算机之间。
  • 是的,我明白这一点。我的意思是,两台具有相同 Win/IE 版本的计算机在一台计算机上启用这些设置而在另一台计算机上禁用这些设置时会表现出不同的行为。
  • 感谢您的提示,我们已验证设置相同,但问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多