【发布时间】:2010-09-06 05:31:38
【问题描述】:
使用 StreamReader 读取 HttpWebResponse 的 GetResponseStream() 返回的流时,我无法读取“分块”响应:
// response is an HttpWebResponse
StreamReader reader = new StreamReader(response.GetResponseStream());
string output = reader.ReadToEnd(); // throws exception...
当调用 reader.ReadToEnd() 方法时,我收到以下 System.IO.IOException:无法从传输连接读取数据:连接已关闭。
当服务器返回“非分块”响应时,上面的代码可以正常工作。
我能够让它工作的唯一方法是对初始请求使用 HTTP/1.0(而不是默认的 HTTP/1.1),但这似乎是一个蹩脚的解决方法。
有什么想法吗?
@查克
您的解决方案效果很好。它仍然在最后一个 Read() 上抛出相同的 IOExeception。但是在检查了 StringBuilder 的内容之后,看起来所有的数据都已经收到了。所以也许我只需要将 Read() 包装在 try-catch 中并吞下“错误”。
【问题讨论】:
-
要读取分块响应,您需要关注en.wikipedia.org/wiki/Chunked_transfer_encoding
-
我在 .NET 4.6 连接到 PowerDNS 3.4.5 HTTP REST API 时看到了这种行为。变通办法没有帮助。如果我吞下异常,我会丢失部分响应。