我正在尝试使用C#中的httpwebrequests从网络服务器读取响应。 我使用以下代码:
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));
代码确实检索了正确的数据量(我比较了用于创建缓冲区的内容长度,以及控制台输出的长度,它们是相同的。 我的问题是,最后80%左右的响应是空白字符。他们都是0x00。 我用几个页面测试了这个,包括wikipedia.com,它只是因为某种原因切断了mid文件。
我是否误解/误用了使用网络请求的方式,或者有人发现错误吗?
答案 0 :(得分:2)
尝试使用此方法:
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;
}
答案 1 :(得分:1)
您的代码存在一些问题:
您尝试使用Stream.Read一次性阅读整个回复 - 这不是它的设计目的。这应该用于更好的阅读,例如4KB块。
您以ASCII编码方式读取HTML响应 - 您确定该页面不包含任何Unicode字符吗?我会坚持使用UTF-8编码以保证安全(或者在响应中读取Content-Type
标题)。
从字节流中读取字符时(这是response
本质上的),推荐的方法是使用StreamReader。更具体地说,如果您想一次性阅读整个流,请使用StreamReader.ReadToEnd。
您的代码可以缩短为:
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());
}