C # eine Webseite herunterladen. Eine bessere Art und Weise benötigt, CPU-Auslastung hoch

StackOverflow https://stackoverflow.com/questions/225617

  •  03-07-2019
  •  | 
  •  

Frage

Ich versuche, dieses Stück Code zu bekommen ein wenig besser zu arbeiten. Ich vermute, es ist die Schleife ein Byte zu einem Zeitpunkt, zu lesen. Ich konnte nicht einen anderen Weg, dies zu tun mit gzip Dekompression finden. ein StreamReader Die Implementierung ist in Ordnung, aber es gibt eine Zeichenfolge, die ich nicht auf den Dekompression Strom passieren kann.

Gibt es einen besseren Weg?

byte[] bufffer = null;
List<byte> resourceBytes = new List<byte>();
int byteValue = 0;
WebResource resource = new WebResource();
HttpWebResponse webResponse = null;

try {
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(resourceUri);
    webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
    webRequest.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    webRequest.UserAgent = agent;
    webRequest.Accept = "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
    webRequest.Credentials = CredentialCache.DefaultCredentials;
    webRequest.Referer = resourceUri.OriginalString;
    webRequest.Timeout = 5000;

    webResponse = (HttpWebResponse)webRequest.GetResponse();

    Stream webStream = webResponse.GetResponseStream();

    if (!string.IsNullOrEmpty(webResponse.ContentEncoding)) {
        if (webResponse.ContentEncoding.ToLower().Contains("gzip")) {
            webStream = new GZipStream(webStream, CompressionMode.Decompress);
        }
        else if (webResponse.ContentEncoding.ToLower().Contains("deflate")) {
            webStream = new DeflateStream(webStream, CompressionMode.Decompress);
        }
    }

    do {
        byteValue = webStream.ReadByte();

        if (byteValue != -1) {
            resourceBytes.Add((byte)byteValue);
        }

    } while (byteValue != -1);


    //Free up resources
    webStream.Close();
    webResponse.Close();

    bufffer = resourceBytes.ToArray();
War es hilfreich?

Lösung

Ich würde zustimmen, dass jmcd WebClient viel einfacher, insbesondere WebClient.DownloadData wäre.

re die eigentliche Frage, das Problem ist, dass man einzelne Bytes lesen, wenn Sie wahrscheinlich einen festen Puffer haben sollten und Schleife - d. H

int bytesRead;
byte[] buffer = new byte[1024];
while((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0) {
  // process "bytesRead" worth of data from "buffer"
}

[Bearbeiten Betonung hinzuzufügen] Die wichtige Bit ist, dass Sie nur Prozess „bytesread“ im Wert von Daten jedes Mal; alles darüber hinaus gibt es Müll.

Andere Tipps

Ist der WebClient Klasse keine Verwendung für das, was Sie tun möchten?

Wenn Sie die Antwort als eine Zeichenfolge, die Sie dies tun können.

String ReponseText;

IO.StreamReader ResponseReader = New IO.StreamReader(webStream );
ReponseText= ResponseReader.ReadToEnd();

Wenn Sie ein tatsächliches Byte-Array tut dies wollen (Sorry, Fühlen Sie sich nicht für diesen einen zu C # wie Umwandlung)

'Declare Array Same size as response
Dim ResponseData(webStream .Length) As Byte 
'Read all the data at once
webStream.Read(ResponseData, 0, webStream .Length)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top