2010-11-22 6 views

Antwort

13

mit der WebResponse.ContentLength Eigenschaft Versuchen. Wenn der Wert -1 zurückgegeben wird, bedeutet dies, dass der ferne Server Ihnen nicht die Länge des Antworthauptteils sendet. Daher können Sie die Länge der Antwort nicht bestimmen, ohne sie vollständig zu lesen.

+0

ich in PHP einen Test tat verwenden sollen, wo Ich habe die Länge des Inhalts ([Code auf Pastebin] (http://pastebin.com/CX7imFKr)), nicht sicher, ob ich es richtig gemacht habe, und ich habe immer noch einen unersehnlichen Stream ... hmm ... Ich werde es versuchen ein echter Download, vielleicht von download.com später ... –

+2

Der Stream 'WebResponse.GetResponseStream' ist nicht suchbar. Es handelt sich um einen Nur-Lese-Stream. Aber der 'ContentLength'-Header, falls gesetzt, ist normalerweise zuverlässig. Du solltest nicht suchen müssen. –

1

Wenn Sie interessiert sind, habe ich eine Code-Referenz-Bibliothek, die eine WebHelper-Klasse enthält. Es ähnelt der WebClient-Klasse (einschließlich der Möglichkeit, den Fortschritt zu melden), ist jedoch flexibler. Es ist in CodePlex gespeichert, der Projektname lautet BizArk.

Es verwendet die Response.ContentLength-Eigenschaft, um die Länge der Antwort zu bestimmen.

Die ContentLength-Eigenschaft wird einfach als Teil der Kopfzeile vom Server gesendet. Es gibt Situationen, in denen der Server die Länge der Antwort vor dem Senden der Kopfzeile möglicherweise nicht kennt. Zum Beispiel, wenn Sie eine dynamisch generierte Webseite mit deaktivierter Pufferung auf dem Server herunterladen.

-3

i gelöst eine Verpackungs Klasse mit dem Namen WebStreamWithLenght (die Methode implementiert wird nicht versuchen, weil ich es nicht brauchte) zu schaffen

Sie es wie diese

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

Warum die Downvotes? Will jemand erklären, warum das keine gute Antwort ist? – setholopolus

Verwandte Themen