响应流中的C#httpwebrequest空白字符

时间:2012-10-31 13:16:42

标签: c# httpwebrequest responsestream

我正在尝试使用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文件。

我是否误解/误用了使用网络请求的方式,或者有人发现错误吗?

2 个答案:

答案 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)

您的代码存在一些问题:

  1. 您尝试使用Stream.Read一次性阅读整个回复 - 这不是它的设计目的。这应该用于更好的阅读,例如4KB块。

  2. 您以ASCII编码方式读取HTML响应 - 您确定该页面不包含任何Unicode字符吗?我会坚持使用UTF-8编码以保证安全(或者在响应中读取Content-Type标题)。

  3. 从字节流中读取字符时(这是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());
    }