C تحميل صفحة ويب #. وهناك طريقة أفضل اللازمة، واستخدام وحدة المعالجة المركزية عالية

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

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا أحاول الحصول على هذه القطعة من التعليمات البرمجية العمل أفضل قليلا. وأظن انها حلقة القراءة بايت واحد في وقت واحد. لم أجد طريقة أخرى للقيام بذلك مع الضغط GZIP. تنفيذ StreamReader على ما يرام، ولكن تقوم بإرجاع سلسلة التي لا يمكن أن تمر على تيار الضغط.

هل هناك طريقة أفضل؟

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();
هل كانت مفيدة؟

المحلول

وكنت أتفق مع jmcd أن WebClient سيكون أبسط بكثير، في WebClient.DownloadData وجه الخصوص.

وإعادة السؤال الفعلي، والمشكلة هي أن تقرأها بايت واحد، عندما يجب أن يكون على الارجح عازلة ثابت، وحلقة - أي بمعنى

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

[عدل إضافة إلى التركيز] بت المهم هو أنك <م> فقط عملية "bytesRead" تستحق من البيانات في كل مرة. كل شيء وراء وجود القمامة.

scroll top