打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#读取网络流,读取网络上的js文件

写博客的目的就是让其他人少走弯路。

C#读取网络上的流和js文件出现的问题

一开始看了今天博客园上的推荐文章,用C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),然后想自己也来采集一下天气,采集目标是腾讯天气。

腾讯天气的数据是用的js提供的(这里就不多做分析了下次有机会再写文章分析),然而用上文中的GetWebClient方法,传递一个js文件的地址,读取到的是一堆乱码。

 

分析问题产生的原因

问题出现了,自然要分析原因,为什么抓包工具能看到字符串的内容,浏览器也能展示字符串的内容,偏偏用程序不可以呢?

尝试了很多方法,换了很多字符编码依然不行。直到我看到了抓包工具中的这么一段内容,原来传递过来的流是一个bytes。

 

 

 

解决问题

看来原因已经找到了,不是编码的问题,而是流本身的内容是二进制内容,直接转string肯定是乱码不对了,所以我们要把stream转成bytes才行。

然后就开始网上搜索对应的内容,然后再踩一个坑。

在使用 int l = stream.Length; 的时候碰到了“此流不支持查找操作”的错误。

这个错误的产生原因本质是网络流没法提前获取到长度,所以这个类不支持查找操作通常是网络流导致的。

然后再继续搜索这个错误的解决方法,然后找到了同样碰到这个问题的前辈,详见:http://bbs.csdn.net/topics/340175313

这里就感谢这位前辈了,很多人在网上提问,没人回答,后来自己解决了问题就算了,没想到回到自己的帖子里去自问自答一下,其实这样自问自答一下可以帮助更多的后面的人!!!

最后我用了如下的方法解决了这个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
public static byte[] ReturnStrem(string url)
   {
       string Url = url;
       byte[] data1 = null;
       MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass();
       _xmlhttp.open("GET", Url, false, null, null);
       _xmlhttp.send(null);
       if (_xmlhttp.readyState == 4)
       {
           data1 = (byte[])_xmlhttp.responseBody;
       }
       _xmlhttp.abort();
       return data1;

  对于新手来说,这里复制了代码又出现了新的问题,我这里一并解释清楚吧。

首先MSXML2是要引用什么?

答:项目右键--引用--COM--Microsoft XML 3.0

引用后直接执行报错“无法嵌入互操作类型”,怎么办?

答:项目--引用--找到MSXML2右键属性,嵌入互操作类型设置为false

 

最后问题圆满解决,解决这个问题花了一下午时间,希望我踩的坑能给其他人节省更多的时间。

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
百度空间存js破坏漏洞 部分用户被威胁删除数据
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
再论怎么有效利用浏览器缓存之------怎么避免浏览器缓存静态文件. --ArtWind‘...
网友热评“AJAX七宗罪”:欲加之罪何患无辞
一个MSXML2.XMLHTTP的POST示例
掌控POST(3)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服