寫博客的目的就是讓其他人少走彎路。
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
最后問題圓滿解決,解決這個問題花了一下午時間,希望我踩的坑能給其他人節省更多的時間。