.net 解析Transfer-Encoding:chunked 秒掉网上无用方案
昨天在爬數據時,發現某個網站Response.Get過來的數據一直是為空。當時就很奇怪,認真看下了響應頭。發現Transfer-Encoding:chunked這個玩意
網上查了下資料
一般情況HTTP的Header包含Content-Length域來指明報文體的長度。
有時候服務生成HTTP回應是無法確定消息大小的,比如大文件的下載,或者后臺需要復雜的邏輯才能全部處理頁面的請求,這時用需要實時生成消息長度,服務器一般使用chunked編碼。
在進行Chunked編碼傳輸時,在回復消息的Headers有transfer-encoding域值為chunked,表示將用chunked編碼傳輸內容。使用chunked編碼的Headers如下(可以利用FireFox的FireBug插件或HttpWatch查看Headers信息,HttpWatch還可以查看chunked的個數):
編碼使用若干個Chunk組成,由一個標明長度為0的chunk結束,每個Chunk有兩部分組成,第一部分是該Chunk的長度和長度單位(一般不寫),第二部分就是指定長度的內容,每個部分用CRLF(全稱carriage return/line feed 回車換行)隔開。在最后一個長度為0的Chunk中的內容是稱為footer的內容,是一些沒有寫的頭部內容。
這上面是網上的原話,具體更詳細的可以去參考里面看看
不過網上很多關于chunked .net解析都是tmd無用,把代碼貼出來,后面的小哥們不要再痛苦。
哥當時也是寫不出解析代碼,想著網上找找,國內找的都千扁一屢,最后在國外論壇找到了方案。
最后通過Fiddler調試看到,POST的網站有返回Content-Length,此時心都炸了。找了半天,你居然告訴我,是有Length返回。但是瀏覽器F12看到的卻是Transfer-Encoding:chunked。
試著在Fiddler上面模擬調試,看看請求前,請求后的變化。
把瀏覽器請求頭內容復制到Fiddler的參數里面,點擊exec,響應區域顯示為空。我的神喲這tmd什么情況,參數有問題?,認真對照一下吧,總會發現有問題
。。。。。
當時我沒有特別注意Cookie,也沒有傳過去,Cookie為空。把瀏覽器里面的Cookie信息拷貝進去。exec,斷點命中了。。。。。。。。。當時是多么的開心,說明這個網站的POST必須要cookie
解析代碼也找到,那再把.net代碼檢查下。運行,拿到了數據。。。。不寫了
貼代碼
StringBuilder sb1 = new StringBuilder(); Byte[] buf = new byte[256]; Stream resStream = myHttpWebResponse.GetResponseStream();resStream = new GZipStream(resStream, CompressionMode.Decompress);string tmpString = null; int count = 0; do { count = resStream.Read(buf, 0, buf.Length - 1); if (count != 0) { tmpString = Encoding.UTF8.GetString(buf, 0, count); sb1.Append(tmpString); } } while (count > 0);?
參考
https://imququ.com/post/transfer-encoding-header-in-http.html
還有一個網站找不到了,可憐了。
http://www.dayuji1000.com/vrtechnews/index.html
http://www.xafuda.cn/article/jnd3.5.html
轉載于:https://www.cnblogs.com/kengwfpzu920/p/6655046.html
總結
以上是生活随笔為你收集整理的.net 解析Transfer-Encoding:chunked 秒掉网上无用方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一章 复数与复变函数
- 下一篇: Android 生成二维码,条形码,二维