繁体   English   中英

当内容长度为零时,强制读取HttpWebResponse.GetResponseStream()

[英]Force To Read HttpWebResponse.GetResponseStream() When Content-Length Is Zero

正如标题所说。

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

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


HTTP / 1.1 200 OK

连接:保持活动状态

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

内容类型:文本/纯文本

内容长度:0

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

(HTTP正文)

查看源代码,我找不到强制这种行为的方法。 可能您无能为力。

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

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

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

第一个问题-您从哪里获得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:分块,不返回Content-Length,如果不进行分块则不返回Content-Length,如果返回非零,则返回0身体。

哈罗德

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM