1

正如标题所说。

有时来自远程服务器的 HTTP 响应包含零值的 Content-Length 标头,但它仍然返回 HTTP body。仍然可以在浏览器中使用 jQuery 获取正文,但使用 HttpWebResponse.GetResponseStream() 无法读取任何内容。我如何强制阅读它?感谢大家。

这是我遇到的 HTTP 响应示例。


HTTP/1.1 200 正常

连接:保持活动

缓存控制:无缓存,无存储

内容类型:文本/纯文本

内容长度:0

日期:2013 年 9 月 30 日星期一 09:34:21 GMT

(HTTP 正文)

4

2 回答 2

0

第一个问题 - 你从哪里得到 HTTP 响应?您是使用 Fiddler 捕获它,还是通过在调试器中检查 HttpWebResponse 来输入您认为看到的内容?如果您还没有,我建议您使用 Fiddler 运行它并检查完整的响应标头。

我们需要首先确定 Content-Length 是否以零值返回,或者项目中的某些其他代码是否导致您将其解释为零或将内容长度的副本设置为零。

我认为这里发生了两件事之一:

  1. 响应与您上面指出的不完全一样,使用 Fiddler 对其进行检查将很快确定。我很可能会怀疑 Content-Length 实际上丢失了并且 Transfer-Encoding 存在并设置为分块;在这种情况下,HttpWebResponse.ContentLength 属性将返回 -1 而不是 0(零)。
  2. 响应与您指示的完全一样(特别是存在 Content-Length 并指定为零),在这种情况下,您的 Web 服务器就被破坏了。我不应该返回 Content-Length 设置为零的正文;如果它是 HTTP 1.0,它可以不返回任何 Content-Length,但它清楚地表示上面的 HTTP 1.1,所以它应该返回 Transfer-Encoding: chunked and no Content-Length 或如果不分块并返回非零 Content-Length身体。

哈罗德

于 2013-09-30T18:43:24.750 回答
0

浏览源代码我找不到强制这种行为的方法。可能你什么都做不了。

尝试禁用 HTTP 管道。在这种情况下,也许 HttpWebRequest 不依赖于内容长度。它不太可能会有所帮助。

要么使用不同的 HTTP 库,要么使用TcpClient. 您可以使用 Fiddler 复制模板 HTTP 请求并将其用作您的基础。不应该做很多工作。

您还可以创建一个删除标头的重写代理。这可能是一个费力的解决方案。

于 2013-09-30T11:49:28.287 回答