当Content-Length为零时强制读取HttpWebResponse.GetResponseStream()

时间:2013-09-30 10:31:32

标签: .net http

正如标题所说。

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

以下是我遇到的HTTP响应示例。


HTTP / 1.1 200确定

连接:保持活力

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

Content-Type:text / plain

内容长度:0

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

(HTTP正文)

2 个答案:

答案 0 :(得分:0)

查看源代码,我无法找到强制此行为的方法。可能你无能为力。

尝试禁用HTTP流水线操作。在这种情况下,HttpWebRequest可能不依赖于内容长度。它不太可能有所帮助。

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

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

答案 1 :(得分:0)

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

如果返回的Content-Length值为零,或者项目中的某些其他代码导致您将其解释为零或将内容长度的副本设置为零,则需要首先建立

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

  1. 答案并不完全如上所述,并且与Fiddler一起检查将很快确定。我很可能会怀疑Content-Length实际上已经丢失并且Transfer-Encoding存在并设置为chunked;在这种情况下,HttpWebResponse.ContentLength属性将返回-1而不是0(零)。
  2. 响应与您指示的完全一致(特别是在Content-Length存在并指定为零),在这种情况下,您的Web服务器刚刚被破坏。我不应该将Content-Length设置为零的主体返回;如果它是HTTP 1.0,它就不能返回Content-Length,但它清楚地说上面的HTTP 1.1,所以它应该返回Transfer-Encoding:chunked并且没有Content-Length或者如果没有chunking并且返回一个非零内容长度体。
  3. 哈罗德