这个问题一直困惑了我很久,始终没有找到原因,用WebRequest读取网页后,经常不能完整的读取出页面代码,经常都是只能获得一部分,而用WebClient却完全正常。
我们都知道WebClient实质上就是调用WebRequest来实现的,为什么我自己用WebRequest来实现没有这么好的效果呢?
我的代码简单说明:
  Uri uri =new Uri("http://xxxx.xx");
HttpWebResponse response = null;
Stream resStream = null;int n = 888192;byte[] buf = new byte[n]; 
byte[] bufTemp = new byte[n]; //临时储存读出地字节request = (HttpWebRequest)WebRequest.Create(uri);
response = (HttpWebResponse)request.GetResponse(); 
int length = Convert.ToInt32(response.ContentLength);
resStream = response.GetResponseStream(); 
resStream.Read(bufTemp, 0, length);//这里始终读取不完整,例如length为8000,我可能只能读取出2000个
Encoding.UTF8.GetString(buf, 0,count);//最后从缓存中出字节内容我一直想找WebClient的源码,想看看究竟WebClient是怎么实现的,但是没找到,希望有高人能解决WebRequest读取不完整的方法.
另外说明:不会是网络问题,同时用WebRequest和webclient测试,webclient就是读取完整的.
嫌分少,一直加

解决方案 »

  1. using System.Net;
           using System.IO;
            private string GetResponse(string url)
            {
                url.Trim();
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);            req.AllowAutoRedirect = true;
                req.MaximumAutomaticRedirections = 3; //text/xml;charset=uft-8
                req.UserAgent = "Mozilla/4.0 (compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 1.1.4322)";
                req.Referer = req.RequestUri.ToString();
                req.KeepAlive = true;
                //req.Method = "Get";
                 
                req.Timeout = -1;            HttpWebResponse webresponse = null;
                try
                {
                    webresponse = (HttpWebResponse)req.GetResponse();
                    if (webresponse != null)
                    {
                        StreamReader reader = new StreamReader(webresponse.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
                        return reader.ReadToEnd();
                    }
                }
                catch (System.Net.WebException ex)
                {
                    return null;
                }
                if (webresponse != null)
                {
                    return "";
                }            return "";
            }        private void button1_Click(object sender, EventArgs e)
            {
                string s = GetResponse("http://xxxx.xx");
                MessageBox.Show(s);
            }
      

  2. 使用StreamReader 的ReadToEnd()方法,经常会出现程序阻塞在那里,读取不出任何内容.那么2楼是不是认为webclient是用ReadToEnd()来实现的?
      

  3.          url.Trim();
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);            req.AllowAutoRedirect = true;
                req.MaximumAutomaticRedirections = 3; //text/xml;charset=uft-8
                req.UserAgent = "Mozilla/4.0 (compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 1.1.4322)";
                req.Referer = req.RequestUri.ToString();
                req.KeepAlive = true;
                //req.Method = "Get";
                 
                req.Timeout = -1;            HttpWebResponse webresponse = null;
                try
                {
                    webresponse = (HttpWebResponse)req.GetResponse();
                    if (webresponse != null)
                    {
                        StreamReader reader = new StreamReader(webresponse.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
                        return reader.ReadToEnd();
                    }
                }
      

  4. 我现在就是这样做的,ReadToEnd是有点阻塞,但读完了还是往下走的
      

  5. 但你用webclient试试,不仅能读完整,并且读取速度非常快,基本不会阻塞.真不知道webclient类具体是怎么实现的,谁能找到源码啊?
      

  6. 测试使用大页面来测试,比如http://www.163.com
      

  7. string result;
    WebResponse myResponse;
    WebRequest myRequest = System.Net.HttpWebRequest.Create(uri);
    myResponse = myRequest.GetResponse();
    using (StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.Default))
    {
          result = sr.ReadToEnd();
          sr.Close();
    }
    myResponse.Close();
      

  8. string result;
                WebResponse myResponse;
                WebRequest myRequest = System.Net.HttpWebRequest.Create(uri);
                myResponse = myRequest.GetResponse();
                using (StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.Default))
                {
                    result = sr.ReadToEnd();
                    sr.Close();
                }
                myResponse.Close();
      

  9. msdn:
    ReadToEnd 假定流在到达末尾时会知道已到达末尾。对于交互式协议(服务器仅当被请求时才发送数据而且不关闭连接),ReadToEnd 可能无限期阻塞,应避免出现这种情况。------------
    如何避免"无限期阻塞"呢?是不是可以使用webRequest.TimeOut 超时时间来避免呢?
      

  10. 还是没人能提供点实质性的东西吗?webclient的源码谁能提供?分全给你哦.
      

类似问题 »