2010-05-19 2 views
0

Я пытаюсь прочитать поток ответов из объекта HttpWebResponse. Я знаю длину потока (_response.ContentLength), однако я продолжаю получать следующее исключение:ArgumentOutOfRangeException при чтении байтов из потока

Указанный аргумент был вне диапазона допустимых значений. Имя параметра: размер

Во время отладки, я заметил, что в момент возникновения ошибки, значения были такими:

длина = 15032 // длина потока, как это определено _response.ContentLength

BytesToRead = 7680 // число байтов в потоке, который по-прежнему должны быть считаны

BytesRead = 7680 // число байтов, которые были считаны (смещение)

body.length = 15032// размер байта [] поток копируется в

Особенность заключается в том, что переменные bytesToRead и bytesRead являются ALWAYS 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

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

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

быть это:

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

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

Вы также не должны эта часть:

if (n == 0) 
    break; 

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

+0

Вы, сэр, гений. Как я могу исправить вторую проблему (поток заполняется медленнее, чем я его читаю)? Не установил бы bytesToRead = length, чтобы все байты потока были прочитаны? – user345194

Смежные вопросы