这个问题一直困惑了我很久,始终没有找到原因,用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就是读取完整的.
嫌分少,一直加
我们都知道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就是读取完整的.
嫌分少,一直加
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);
}
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();
}
}
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();
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();
ReadToEnd 假定流在到达末尾时会知道已到达末尾。对于交互式协议(服务器仅当被请求时才发送数据而且不关闭连接),ReadToEnd 可能无限期阻塞,应避免出现这种情况。------------
如何避免"无限期阻塞"呢?是不是可以使用webRequest.TimeOut 超时时间来避免呢?