.net 解析Transfer-Encoding:chunked 秒掉网上无用方案
昨天在爬數(shù)據(jù)時(shí),發(fā)現(xiàn)某個(gè)網(wǎng)站Response.Get過(guò)來(lái)的數(shù)據(jù)一直是為空。當(dāng)時(shí)就很奇怪,認(rèn)真看下了響應(yīng)頭。發(fā)現(xiàn)Transfer-Encoding:chunked這個(gè)玩意
網(wǎng)上查了下資料
一般情況HTTP的Header包含Content-Length域來(lái)指明報(bào)文體的長(zhǎng)度。
有時(shí)候服務(wù)生成HTTP回應(yīng)是無(wú)法確定消息大小的,比如大文件的下載,或者后臺(tái)需要復(fù)雜的邏輯才能全部處理頁(yè)面的請(qǐng)求,這時(shí)用需要實(shí)時(shí)生成消息長(zhǎng)度,服務(wù)器一般使用chunked編碼。
在進(jìn)行Chunked編碼傳輸時(shí),在回復(fù)消息的Headers有transfer-encoding域值為chunked,表示將用chunked編碼傳輸內(nèi)容。使用chunked編碼的Headers如下(可以利用FireFox的FireBug插件或HttpWatch查看Headers信息,HttpWatch還可以查看chunked的個(gè)數(shù)):
編碼使用若干個(gè)Chunk組成,由一個(gè)標(biāo)明長(zhǎng)度為0的chunk結(jié)束,每個(gè)Chunk有兩部分組成,第一部分是該Chunk的長(zhǎng)度和長(zhǎng)度單位(一般不寫),第二部分就是指定長(zhǎng)度的內(nèi)容,每個(gè)部分用CRLF(全稱carriage return/line feed 回車換行)隔開(kāi)。在最后一個(gè)長(zhǎng)度為0的Chunk中的內(nèi)容是稱為footer的內(nèi)容,是一些沒(méi)有寫的頭部?jī)?nèi)容。
這上面是網(wǎng)上的原話,具體更詳細(xì)的可以去參考里面看看
不過(guò)網(wǎng)上很多關(guān)于chunked .net解析都是tmd無(wú)用,把代碼貼出來(lái),后面的小哥們不要再痛苦。
哥當(dāng)時(shí)也是寫不出解析代碼,想著網(wǎng)上找找,國(guó)內(nèi)找的都千扁一屢,最后在國(guó)外論壇找到了方案。
最后通過(guò)Fiddler調(diào)試看到,POST的網(wǎng)站有返回Content-Length,此時(shí)心都炸了。找了半天,你居然告訴我,是有Length返回。但是瀏覽器F12看到的卻是Transfer-Encoding:chunked。
試著在Fiddler上面模擬調(diào)試,看看請(qǐng)求前,請(qǐng)求后的變化。
把瀏覽器請(qǐng)求頭內(nèi)容復(fù)制到Fiddler的參數(shù)里面,點(diǎn)擊exec,響應(yīng)區(qū)域顯示為空。我的神喲這tmd什么情況,參數(shù)有問(wèn)題?,認(rèn)真對(duì)照一下吧,總會(huì)發(fā)現(xiàn)有問(wèn)題
。。。。。
當(dāng)時(shí)我沒(méi)有特別注意Cookie,也沒(méi)有傳過(guò)去,Cookie為空。把瀏覽器里面的Cookie信息拷貝進(jìn)去。exec,斷點(diǎn)命中了。。。。。。。。。當(dāng)時(shí)是多么的開(kāi)心,說(shuō)明這個(gè)網(wǎng)站的POST必須要cookie
解析代碼也找到,那再把.net代碼檢查下。運(yùn)行,拿到了數(shù)據(jù)。。。。不寫了
貼代碼
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
還有一個(gè)網(wǎng)站找不到了,可憐了。
http://www.dayuji1000.com/vrtechnews/index.html
http://www.xafuda.cn/article/jnd3.5.html
轉(zhuǎn)載于:https://www.cnblogs.com/kengwfpzu920/p/6655046.html
總結(jié)
以上是生活随笔為你收集整理的.net 解析Transfer-Encoding:chunked 秒掉网上无用方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第一章 复数与复变函数
- 下一篇: ClickHouse之简单性能测试