HttpWebRequest 请求数据,每次返回长度都不一样
如果是数据长度不长,是没问题的,如果数据长度太长了,就返回不全了。在IE里打开是可以全部返回的,这知道什么问题,郁闷了好几天了。
private string getJson(string strUrl) { HttpWebRequest loginHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(strUrl); loginHttpWebRequest.Timeout = 99999; loginHttpWebRequest.MaximumResponseHeadersLength = 9999999; loginHttpWebRequest.ReadWriteTimeout = 99999;//获取或设置写入或读取流时的超时(以毫秒为单位)。 loginHttpWebRequest.AllowWriteStreamBuffering = true; loginHttpWebRequest.KeepAlive = true; loginHttpWebRequest.Method = "POST"; loginHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; loginHttpWebRequest.CookieContainer = D_Partner_Model.clsSysConfig._actionCookie; // 给HttpWebRequest指定CookieContainer //loginHttpWebRequest.Method = "GET"; WebResponse response = loginHttpWebRequest.GetResponse(); Stream responseStream = response.GetResponseStream(); StringBuilder strLine = new StringBuilder(); //System.Threading.Thread.Sleep(2000); StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8); char[] readBuff = new char[1024 * 1024]; int buffCountLength = 0; int count = streamReader.Read(readBuff, 0, readBuff.Length); buffCountLength = count; while (count > 0) { String outputData = new String(readBuff, 0, count); strLine.Append(outputData); count = streamReader.Read(readBuff, 0, readBuff.Length); } string strJson = strLine.ToString(); streamReader.Close(); responseStream.Close(); return strJson; }
而且重复请求,返回的数据长度还不一样? 就是strJson得到的数据长度不一样。这个我想应该和网速有一点关系,但不知道为什么返回不全,要暂停一下,让数据返回?不知道在哪暂停。。。。高手们帮忙啊!!
估计也没什么好的办法解决了。。结贴!感谢各位的热心帮助!
网络数据按封包传递的,不可能一次传完!
我估计也是这个问题,最后我没办法了,只能new一个WebBrower,委托回主窗体执行,使用WebBrower控件是没问题的。
你的整个过程并没有什么问题,但是我不明白,你构造StreamReader干吗?responseStream已经是stream了,还要构建?只是为了字符串的读写吗?数据流读取的时候,不可能按照字符个数的,而是按照字节个数的。
这样,当你读取的字节流中的内容有个字符跨越了两次读写的数据内容的时候。。。问题有多严重,你知道吗?
private string getJson(string strUrl) { HttpWebRequest loginHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(strUrl); loginHttpWebRequest.Timeout = 99999; loginHttpWebRequest.MaximumResponseHeadersLength = 9999999; loginHttpWebRequest.ReadWriteTimeout = 99999;//获取或设置写入或读取流时的超时(以毫秒为单位)。 loginHttpWebRequest.AllowWriteStreamBuffering = true; loginHttpWebRequest.KeepAlive = true; loginHttpWebRequest.Method = "POST"; loginHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; loginHttpWebRequest.CookieContainer = D_Partner_Model.clsSysConfig._actionCookie; // 给HttpWebRequest指定CookieContainer //loginHttpWebRequest.Method = "GET"; WebResponse response = loginHttpWebRequest.GetResponse(); Stream responseStream = response.GetResponseStream();
byte[] readBuff = new byte[4096]; int buffCountLength = 0; int count = streamReader.Read(readBuff, 0, readBuff.Length); buffCountLength = count; using(MemoryStream ms = new MemoryStream()) { while ((count = responseStream.Read(readBuff, 0, readBuff.Length))> 0) { ms.Write(readBuff, 0, count); } ms.Position=0; string strJson = new StreamReader(ms).ReadToEnd(); return strJson; } }
参考我上面的代码,必要的地方修正下吧。
多谢【笨笨蜗牛】前辈指正,但我照着您的代码执行了一下,还是返回不全!
@项工: 是你认为的文件大小不对还是发现文字级别的内容不完整?假如只是文件级别的大小不同,那可能是编码问题,毕竟不同的编码对不同的文字所产生的字节流的大小是不同的。而且,对于文本文件,还有一个是否把内容编码签名放在文件开始的策略(占3字节)。
@笨笨蜗牛: 是内容不完整,比如说应该返回12345但,实际只返回123。4和5没回来。
直接用 你的 streamReader ReadToEnd试试 一次读完
使用ReadToEnd读取,结果是一样的,读不全。
代码读取方式的问题。你那种方式好像是有长度限制的。
请参考以下代码方式:
WebResponse wr = null;
Stream stream = null;
wr = WebRequest.Create(headurl).GetResponse();
stream = wr.GetResponseStream();
BinaryReader br = new BinaryReader(stream);
byte[] b = br.ReadBytes((int)wr.ContentLength);
wr.ContentLength 返回-1
@项工:contentLength 返回-1说明网页是gzip压缩的
用binaryReader试试
using
(BinaryReader s =
new
BinaryReader(req.GetResponse().GetResponseStream()))
{
byte
[] buf = s.ReadBytes(1024 * 1024);
}
请求的时候用Gzip,专门针对大数量的,呵呵
loginHttpWebRequest .Headers.Add("Accept-Encoding", "gzip, deflate");
不是下载文件,是请求JAVA的Action。
你现在使用网络请求,对于网络流来说,不像文件流,通过判断读取的字节数为 0 ,不能确定已经读取了全部的数据。
在取得 HttpResponse 对象的时候,可以通过这个对象的 Content-Length 属性来获取实际的内容长度,然后读取指定长度的内容。
Content-Length返回来的值,与实际值相差太大了,用插件查看应该是5万多,用Content-Length才2千多。