首页 新闻 会员 周边

HttpWebRequest 请求数据,每次返回长度都不一样

0
悬赏园豆:100 [已解决问题] 解决于 2012-06-25 10:10

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得到的数据长度不一样。这个我想应该和网速有一点关系,但不知道为什么返回不全,要暂停一下,让数据返回?不知道在哪暂停。。。。高手们帮忙啊!!

 

估计也没什么好的办法解决了。。结贴!感谢各位的热心帮助!

项工的主页 项工 | 初学一级 | 园豆:71
提问于:2012-06-21 14:19
< >
分享
最佳答案
0

网络数据按封包传递的,不可能一次传完!

收获园豆:15
缤纷夏日 | 菜鸟二级 |园豆:425 | 2012-06-24 23:39

我估计也是这个问题,最后我没办法了,只能new一个WebBrower,委托回主窗体执行,使用WebBrower控件是没问题的。

项工 | 园豆:71 (初学一级) | 2012-06-25 10:06
其他回答(5)
0

你的整个过程并没有什么问题,但是我不明白,你构造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; } }

参考我上面的代码,必要的地方修正下吧。

收获园豆:30
无之无 | 园豆:5095 (大侠五级) | 2012-06-21 14:54

多谢【笨笨蜗牛】前辈指正,但我照着您的代码执行了一下,还是返回不全!

支持(0) 反对(0) 项工 | 园豆:71 (初学一级) | 2012-06-21 15:05

@项工: 是你认为的文件大小不对还是发现文字级别的内容不完整?假如只是文件级别的大小不同,那可能是编码问题,毕竟不同的编码对不同的文字所产生的字节流的大小是不同的。而且,对于文本文件,还有一个是否把内容编码签名放在文件开始的策略(占3字节)。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-21 15:13

@笨笨蜗牛: 是内容不完整,比如说应该返回12345但,实际只返回123。4和5没回来。

支持(0) 反对(0) 项工 | 园豆:71 (初学一级) | 2012-06-25 10:08
0

直接用 你的 streamReader  ReadToEnd试试 一次读完

收获园豆:10
xujif | 园豆:304 (菜鸟二级) | 2012-06-21 20:08

使用ReadToEnd读取,结果是一样的,读不全。

支持(0) 反对(0) 项工 | 园豆:71 (初学一级) | 2012-06-25 10:02
0

代码读取方式的问题。你那种方式好像是有长度限制的。

请参考以下代码方式:

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);
收获园豆:20
寒风吹过 | 园豆:149 (初学一级) | 2012-06-22 13:00

wr.ContentLength 返回-1

支持(0) 反对(0) 项工 | 园豆:71 (初学一级) | 2012-06-25 10:03

@项工:contentLength 返回-1说明网页是gzip压缩的

用binaryReader试试

using (BinaryReader s = new BinaryReader(req.GetResponse().GetResponseStream()))
 {
     byte[] buf = s.ReadBytes(1024 * 1024);
}
支持(0) 反对(0) xujif | 园豆:304 (菜鸟二级) | 2012-06-25 11:50
0

请求的时候用Gzip,专门针对大数量的,呵呵

收获园豆:10
代码示例 | 园豆:49 (初学一级) | 2012-06-22 16:52

 loginHttpWebRequest .Headers.Add("Accept-Encoding", "gzip, deflate");

支持(0) 反对(0) 代码示例 | 园豆:49 (初学一级) | 2012-06-22 16:54

不是下载文件,是请求JAVA的Action。

支持(0) 反对(0) 项工 | 园豆:71 (初学一级) | 2012-06-25 10:04
0

你现在使用网络请求,对于网络流来说,不像文件流,通过判断读取的字节数为 0 ,不能确定已经读取了全部的数据。

在取得 HttpResponse 对象的时候,可以通过这个对象的 Content-Length 属性来获取实际的内容长度,然后读取指定长度的内容。

收获园豆:15
冠军 | 园豆:886 (小虾三级) | 2012-06-23 09:55

Content-Length返回来的值,与实际值相差太大了,用插件查看应该是5万多,用Content-Length才2千多。

支持(0) 反对(0) 项工 | 园豆:71 (初学一级) | 2012-06-25 10:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册