使用HttpWebResponse读取"chunked"响应

Cra*_*aig 12 c# http .net-3.5 .net-2.0

使用StreamReader读取HttpWebResponse的GetResponseStream()返回的流时,我无法读取"chunked"响应:

// response is an HttpWebResponse
StreamReader reader = new StreamReader(response.GetResponseStream());
string output = reader.ReadToEnd(); // throws exception...
Run Code Online (Sandbox Code Playgroud)

reader.ReadToEnd()调用该方法时,我得到以下System.IO.IOException:无法从传输连接读取数据:连接已关闭.

当服务器返回"非分块"响应时,上面的代码工作得很好.

我能够让它工作的唯一方法是使用HTTP/1.0作为初始请求(而不是默认的HTTP/1.1),但这似乎是一种蹩脚的解决方法.

有任何想法吗?


@Chuck

你的解决方案非常好用.它仍然在最后一个Read()上抛出相同的IOExeception.但在检查StringBuilder的内容后,看起来已经收到了所有数据.所以也许我只需要在try-catch中包装Read()并吞下"错误".

小智 2

还没有尝试过“分块”响应,但是这样的东西会起作用吗?

StringBuilder sb = new StringBuilder();
Byte[] buf = new byte[8192];
Stream resStream = response.GetResponseStream();
string tmpString = null;
int count = 0;
do
{
     count = resStream.Read(buf, 0, buf.Length);
     if(count != 0)
     {
          tmpString = Encoding.ASCII.GetString(buf, 0, count);
          sb.Append(tmpString);
     }
}while (count > 0);
Run Code Online (Sandbox Code Playgroud)

  • 这对于多字节编码(即不是 ASCII)来说是危险的,因为不能保证读取将与字符边界对齐。 (5认同)
  • @Chuck你不能只使用ASCII,你需要弄清楚实际使用的编码,即通过Content-Type,然后使用它来“GetString” (2认同)