C تحميل صفحة ويب #. وهناك طريقة أفضل اللازمة، واستخدام وحدة المعالجة المركزية عالية
سؤال
وأنا أحاول الحصول على هذه القطعة من التعليمات البرمجية العمل أفضل قليلا. وأظن انها حلقة القراءة بايت واحد في وقت واحد. لم أجد طريقة أخرى للقيام بذلك مع الضغط 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" تستحق من البيانات في كل مرة. كل شيء وراء وجود القمامة.
نصائح أخرى
إذا كنت تريد الرد كسلسلة يمكنك القيام بذلك.
String ReponseText;
IO.StreamReader ResponseReader = New IO.StreamReader(webStream );
ReponseText= ResponseReader.ReadToEnd();
إذا كنت تريد صفيف بايت الفعلي تفعل ذلك (عذرا، لا تشعر مثل تحويل إلى C # لهذا واحد)
'Declare Array Same size as response
Dim ResponseData(webStream .Length) As Byte
'Read all the data at once
webStream.Read(ResponseData, 0, webStream .Length)