ArgumentOutOfRangeException при чтении байтов из потока - PullRequest
0 голосов
/ 19 мая 2010

Я пытаюсь прочитать поток ответа от объекта 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 Ответ

1 голос
/ 19 мая 2010

Вы хотите эту строку:

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

быть таким:

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

Вы говорите, что максимальное число байтов для чтения - это длина потока, но это не так, поскольку на самом деле это только оставшаяся информация в потоке после смещения было применено.

Вам также не нужна эта часть:

if (n == 0)
   break;

Оператор while должен правильно завершить чтение, и, возможно, вы не прочитаете ни одного байта до того, как закончите все это (если поток заполняется медленнее, чем вы извлекаете из него данные)

...