C#httpwebrequest响应团队中的空白字符

C#httpwebrequest响应团队中的空白字符,c#,httpwebrequest,responsestream,C#,Httpwebrequest,Responsestream,我正在尝试使用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"; HttpWebRe

我正在尝试使用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));
代码确实检索到了正确的数据量(我将用于创建缓冲区的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;
}

您的代码有几个问题:

  • 您尝试使用一次读取整个响应-这不是它的设计目的。这应该用于更优化的读取,例如4KB块

  • 您将HTML响应读取为ASCII编码-您确定页面不包含任何Unicode字符吗?为了安全起见,我会坚持使用UTF-8编码(或者读取响应中的
    内容类型
    标题)

  • 当从字节流中读取字符时(这是您的
    响应的本质),推荐的方法是使用。更具体地说,如果您想一次性读取整个流,请使用

    您的代码可以缩短为:

    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());
    }
    

    这确实有效。但就我的教育而言,是什么造成了差异?我看到的唯一真正的差异是在流上使用压缩/解压缩,以及选择“GET”方法的更漂亮的方式。