Capita, ogni tanto, di avere a che fare con la lettura di dati da server remoti. In questi casi, HttpWebRequest ci viene in contro, fornendoci tutti gli strumenti necessari.

Finché si tratta di pagine web, ci sono pochi problemi. Abbiamo qualche piccolo pensieri in più, invece, quando si tratta di dati binari: spesso e volentieri, il risultato appare incompleto. Per esempio, le immagini vengono restituite con un bel po' di byte persi qua e là. Questo perché, se è vero che nel leggere stringhe basta utilizzare il consueto ReadToEnd, per leggere dati binari conviene sempre utilizzare il meccanismo del buffer, ossia leggere un pezzo per volta.

   1:   
   2:  byte[] output;
   3:   
   4:  WebRequest request = WebRequest.Create(url);
   5:  using(WebResponse response = request.GetResponse())
   6:  {
   7:     using(Stream rs= response.GetResponseStream())
   8:     {
   9:        using(MemoryStream ms= new MemoryStream())
  10:        {
  11:           int count = 0;
  12:           byte[] buffer = new byte[4096];
  13:           do
  14:           {
  15:              count = rs.Read(buffer, 0, buffer.Length);
  16:              ms.Write(buffer, 0, count);
  17:   
  18:           } while(count != 0);
  19:   
  20:           output= ms.ToArray();
  21:        }
  22:     }
  23:  }
 

In questo modo siamo sicuri di riuscire a leggere tutto il contenuto binario, senza perderci dati per strada. L’ideale è, chiaramente, fare un metodo helper che si occupi di tutto!