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

 

最后問題圓滿解決,解決這個問題花了一下午時間,希望我踩的坑能給其他人節省更多的時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM