1

我正在尝试使用 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,它只是出于某种原因切断了中间文件。

我是否误解/误用了使用 webrequests 的方式,或者任何人都可以在这里发现错误?

4

2 回答 2

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;
}
于 2012-10-31T13:20:54.347 回答
1

您的代码有几个问题:

  1. 您尝试使用Stream.Read 一口气阅读整个响应- 这不是它的设计目的。这应该用于更优化的读取,例如 4KB 块。

  2. 您以 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());
}
于 2012-10-31T14:10:03.837 回答