2010-05-19 4 views
0

J'essaie de lire le flux de réponse d'un objet HttpWebResponse. Je connais la longueur du flux (_response.ContentLength) mais je continue à obtenir l'exception suivante:ArgumentOutOfRangeException lors de la lecture d'octets à partir du flux

L'argument spécifié était hors de la plage de valeurs valides. Nom du paramètre: Taille

Bien que le débogage, j'ai remarqué que, au moment de l'erreur, les valeurs sont en tant que telles:

longueur = 15032 // la longueur du cours d'eau tel que défini par _response.ContentLength

bytesToRead = 7680 // le nombre d'octets dans le flux qui doivent encore être lu

bytesRead = 7680 // le nombre d'octets qui ont été lus (offset)

body.length = 15032// La taille de l'octet [] le flux est copié à

La chose particulière est que les variables bytesToRead et bytesRead sont TOUJOURS 7680, quelle que soit la taille du flux (contenue dans la variable length). Des idées?

code:

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; 

Répondre

1

Vous voulez cette ligne:

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

être le suivant:

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

Vous dites que le nombre maximal d'octets à lire est la longueur du flux , mais ce n'est pas le cas puisque ce n'est en fait que l'information restante dans le flux après le décalage a été appliqué.

Vous ne devriez pas besoin de cette partie:

if (n == 0) 
    break; 

Le tout devrait mettre fin à la lecture correctement, et il est possible que vous ne lire aucun octet avant d'avoir terminé la chose (si le stream se remplit plus lentement que vous n'en sortez les données)

+0

Vous, monsieur, êtes un génie. Comment pourrais-je remédier au deuxième problème (le remplissage du flux est plus lent que je ne le lis)? La définition de bytesToRead = length ne permettrait-elle pas de lire tous les octets du flux? – user345194

Questions connexes