这个问题一直困惑了我很久,始终没有找到原因,用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就是读取完整的.
嫌分少,一直加
解决方案 »
- “MyQQModels.Messages”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“MyQQModels
- Winform连接数据库的问题··哭求援助
- 请问哪有VISUAL c++ 6.0下载
- 水晶报表的数据库登录问题!
- 紧急求助
- 如何隐藏或禁用word2010中的file tab(backstage view)
- 在两个表之间添加 DataRelation, 代码如何写?
- 怎样把一个对象序列化,然后反序列化(在内存中进行)
- ----------------------请教--------------------------
- 100分!!再线!!不够再加!!
- 关于根据图片从A文件夹中复制到B文件夹中
- 打印王后的攻击线
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 超时时间来避免呢?