標籤:.com 頭部 htm bsp pre stringbu 需要 網站 請求
昨天在爬資料時,發現某個網站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
.net 解析Transfer-Encoding:chunked 秒掉網上無用方案