2011-09-11 3 views
13

他のウェブサイトからhtmlページをダウンロードするプログラムを書いています。 特定のWebサイトでは、完全なHTMLコードを取得できないという問題が見つかりました。そして私は部分的な内容しか得ることができません。 この問題のサーバーは、 "Transfer-Encoding:chunked"でデータを送信しています これは問題の原因です。返品コンテンツがTransfer-Encodingの場合、HttpWebResponseから完全なコンテンツを取得する方法:チャンク?

このサーバから返されたヘッダー情報:ここでは

Transfer-Encoding: chunked 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Content-Type: text/html; charset=UTF-8 
Date: Sun, 11 Sep 2011 09:46:23 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Server: nginx/1.0.6 

が私のコードです:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
HttpWebResponse response; 
CookieContainer cookie = new CookieContainer(); 
request.CookieContainer = cookie; 
request.AllowAutoRedirect = true; 
request.KeepAlive = true; 
request.UserAgent = 
    @"Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 FirePHP/0.6"; 
request.Accept = @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
string html = string.Empty; 
response = request.GetResponse() as HttpWebResponse; 

using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    html = reader.ReadToEnd(); 
} 

私は部分的にしかHTMLコードを取得することができます(私はそれが最初のチャンクだと思いますサーバーから)。誰でも助けてくれますか?どんな解決策ですか?

ありがとうございます!

+0

HttpWebResponseはすでにチャンクデータを処理する方法を知っています。あなたが無視できないのは、ContentEncodingです。あなたはStreamReaderのコンストラクタ呼び出しでutf8を使うと仮定しますが、そうでない場合は間違っています。 –

+0

こんにちはハンス・パッセント、ご意見ありがとうございます。私は、WebページがUTF8エンコーディングであることを確認します。 StreamReaderのエンコーディング設定をASCIIに変更しようとしましたが、Unicodeに変更すると同じ結果が得られますが、すべてのコンテンツはコードを読み取ることができません。 – syking

+0

@ HansPassant私は明らかに同じ問題を抱えていますが、StreamReaderコンストラクタでエンコーディングを渡すことは役に立たないようです。また、ResponseStreamをMemoryStreamにコピーし、可能なすべてのエンコーディング用にStreamReaderを作成してみましたが、どれもすべてのチャンクを完全にダンプできないようです。何か案が? –

答えて

-1

私はあなたがあなたがチャンクデータを読み取るReadToEndを使用することはできませんライン

string htmlLine = reader.ReadLine(); 
9

によってラインを読んでそれを行うことができます求めているものを理解している場合。 GetBytesを使用してレスポンスストリームから直接読み込む必要があります。

StringBuilder sb = new StringBuilder(); 
Byte[] buf = new byte[8192]; 
Stream resStream = response.GetResponseStream(); 

do 
{ 
     count = resStream.Read(buf, 0, buf.Length); 
     if(count != 0) 
     { 
          sb.Append(Encoding.UTF8.GetString(buf,0,count)); // just hardcoding UTF8 here 
     } 
}while (count > 0); 
String html = sb.ToString(); 
+0

この回答はうまくいきますが、コードがありません。 'count'という名前の変数は定義されていません。 whileループで 'count--'を追加するよりも、buf.Lengthで変数と設定値を定義するとうまくいきます。 – bafsar

+0

@bafsarこれは、次のようにresponse.ContentLengthを使用する方がよいでしょう。Byte [] buf = new byte [response.ContentLength];正しいバッファ長を得るには – Redeemed1

+0

@ Redeemed1 Transfer-EncodingでContentLengthが設定されていない:chunked – GeorgeChond

関連する問題