从流中读取字节时的ArgumentOutOfRangeException

时间:2010-05-19 15:28:28

标签: c# stream bytearray httpwebresponse

我正在尝试从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;

1 个答案:

答案 0 :(得分:1)

你想要这一行:

int n = stream.Read(body, bytesRead, length);

是这样的:

int n = stream.Read(body, bytesRead, bytesToRead);

你说要读取的最大字节数是流的长度,但它不是因为它实际上只是在偏移量被应用之后的流中的剩余信息。

你也不应该需要这个部分:

if (n == 0)
   break;

while应该正确地结束读取,并且你可能在完成整个事情之前不会读取任何字节(如果流填充的速度慢于从中获取数据)