我正在尝试从HttpWebResponse对象读取响应流。我知道流的长度(_response.ContentLength)但是我一直得到以下异常:
指定的参数超出了有效值的范围。 参数名称:大小
在调试时,我注意到在出错时,值是这样的:
length = 15032 //由_response.ContentLength
定义的流的长度bytesToRead = 7680 //仍然需要读取的流中的字节数
bytesRead = 7680 //已读取的字节数(偏移量)
body.length = 15032 //正在将流复制到
的字节[]的大小奇特之处在于,无论流的大小(包含在长度变量中),bytesToRead和bytesRead变量总是7680。有什么想法吗?
代码:
int length = (int)_response.ContentLength;
byte[] body = null;
if (length > 0)
{
int bytesToRead = length;
int bytesRead = 0;
try
{
body = new byte[length];
using (Stream stream = _response.GetResponseStream())
{
while (bytesToRead > 0)
{
// Read may return anything from 0 to length.
int n = stream.Read(body, bytesRead, length);
// The end of the file is reached.
if (n == 0)
break;
bytesRead += n;
bytesToRead -= n;
}
stream.Close();
}
}
catch (Exception exception)
{
throw;
}
}
else
{
body = new byte[0];
}
_responseBody = body;
答案 0 :(得分:1)
你想要这一行:
int n = stream.Read(body, bytesRead, length);
是这样的:
int n = stream.Read(body, bytesRead, bytesToRead);
你说要读取的最大字节数是流的长度,但它不是因为它实际上只是在偏移量被应用之后的流中的剩余信息。
你也不应该需要这个部分:
if (n == 0)
break;
while应该正确地结束读取,并且你可能在完成整个事情之前不会读取任何字节(如果流填充的速度慢于从中获取数据)