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

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

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

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

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

分析问题产生的原因

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

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

解决问题

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

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

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

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

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

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

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

 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

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

原文地址:https://www.cnblogs.com/JangoJing/p/4773712.html