我正在尝试使用C#中的httpwebrequests从Web服务器中读取依据。我使用以下代码:
UriBuilder urib = new UriBuilder();
urib.Host = "wikipedia.com";
HttpWebRequest req = WebRequest.CreateHttp(urib.Uri);
req.KeepAlive = false;
req.Host = "wikipedia.com/";
req.Method = "GET";
HttpWebResponse response = (HttpWebResponse) req.GetResponse();
byte[] buffer = new byte[response.ContentLength];
System.IO.Stream stream = response.GetResponseStream();
stream.Read(buffer, 0, buffer.Length);
Console.WriteLine(System.Text.Encoding.ASCII.GetString(buffer, 0, buffer.Length));
代码确实确实检索了正确数量的数据(i比较了用于创建缓冲区的contentLength,以及控制台输出的长度,它们是相同的。我的问题是响应的最后80%左右是空白的炭。它们都是0x00。我用几页进行了测试,其中包括wikipedia.com,它只是由于某种原因将其切断。
我是否误解/滥用了使用WebRequests的方法,或者在这里有人发现错误?
尝试使用此方法:
public static String GetResponseString(Uri url, CookieContainer cc)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = WebRequestMethods.Http.Get;
request.CookieContainer = cc;
request.AutomaticDecompression = DecompressionMethods.GZip;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
String responseString = reader.ReadToEnd();
response.Close();
return responseString;
}
您的代码有两个问题:
-
您试图使用stream进行一次阅读整个响应。阅读 - 这不是它的设计。这应该用于更优化的阅读,例如4KB块。
-
您的读取HTML响应作为ASCII编码 - 您确定页面不包含任何Unicode字符吗?我会坚持使用UTF-8编码以确保安全(或者读取响应中的
Content-Type
标头)。
从字节流读取字符时(这是您的response
本质上是)推荐的方法是使用StreamReader。更具体地说,如果您想一次阅读整个流,请使用streamReader.readto.
您的代码可以缩短为:
HttpWebRequest req = WebRequest.CreateHttp(new Uri("http://wikipedia.org"));
req.Method = WebRequestMethods.Http.Get;
using (var response = (HttpWebResponse)req.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
Console.WriteLine(reader.ReadToEnd());
}