2010-11-22 8 views

risposta

13

Prova utilizzando la proprietà WebResponse.ContentLength. Se restituisce -1, significa che il server remoto non ti sta inviando la lunghezza del corpo della risposta, e quindi non puoi determinare la lunghezza della risposta senza leggerla nella sua interezza.

+0

ho fatto un test in PHP in cui Ho impostato la lunghezza del contenuto ([codice su pastebin] (http://pastebin.com/CX7imFKr)), non sono sicuro se l'ho fatto bene, e ho ancora un flusso non desiderato ... hmm ... Proverò un vero download, forse da download.com più tardi ... –

+2

Il flusso 'WebResponse.GetResponseStream' non è ricercabile. È un flusso di sola lettura, di sola lettura. Ma l'intestazione 'ContentLength', se impostata, è generalmente affidabile. Non dovresti cercare. –

1

Se sei interessato, ho una libreria di codici di riferimento che include una classe WebHelper. È simile alla classe WebClient (inclusa la possibilità di segnalare i progressi), ma è più flessibile. È memorizzato su CodePlex, il nome del progetto è BizArk.

Utilizza la proprietà Response.ContentLength per determinare la lunghezza della risposta.

La proprietà ContentLength viene semplicemente inviata come parte dell'intestazione dal server. Vi sono situazioni in cui il server potrebbe non conoscere la lunghezza della risposta prima di inviare l'intestazione. Ad esempio, se si sta scaricando una pagina Web generata dinamicamente con il buffering disattivato sul server.

-3

ho risolto creando una classe di nome involucro WebStreamWithLenght (la cercano metodo non è implementato perché non ho bisogno)

si dovrebbe usare in questo modo

WebRequest req = HttpWebRequest.Create(link); 
WebResponse res = req.GetResponse(); 
var stream = res.GetResponseStream(); 
var streamWithLenght = new WebStreamWithLenght(stream, res.ContentLength); 

    public class WebStreamWithLenght : Stream 
    { 
     long _Lenght; 
     Stream _Stream; 
     long _Position; 

     public WebStreamWithLenght(Stream stream, long lenght) 
     { 
      _Stream = stream; 
      _Lenght = lenght; 
     } 

     public override bool CanRead 
     { 
      get { return _Stream.CanRead; } 
     } 

     public override bool CanSeek 
     { 
      get { return true; } 
     } 

     public override bool CanWrite 
     { 
      get { return _Stream.CanWrite; } 
     } 

     public override void Flush() 
     { 
      _Stream.Flush(); 
     } 

     public override long Length 
     { 
      get { return _Lenght; } 
     } 

     public override long Position { get; set; } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      var result = _Stream.Read(buffer, offset, count); 
      Position += count; 
      return result; 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void SetLength(long value) 
     { 
      _Lenght = value; 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      Write(buffer, offset, count); 
     } 
    } 
+0

Perché i downvotes? Qualcuno vuole spiegare perché questa non è una buona risposta? – setholopolus

Problemi correlati