2011-10-27 10 views
3

HttpWebResponseを使用してファイルをダウンロードすると、サーバーから送信されたコンテンツの長さが間違っているため、HttpWebResponseは途中でファイルのダウンロードを停止します。あなたがブラウズするとき、IEはこの問題を抱えていないようです。 HttpWebResponseにコンテンツの長さを無視させる方法についてのアイデア。 何か助けていただければ幸いです。HttpWebRequestコンテンツ長エラー

--Example

class Program 
{ 
    static void Main(string[] args) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:59771/Default.aspx"); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     Console.WriteLine("Content length: " + response.ContentLength); 

     int bytesRead = 0; 
     long totalBytesRead = 0; 

     byte[] data = new byte[1024 * 64]; 
     StringBuilder output = new StringBuilder(); 

     Stream responseStream = response.GetResponseStream(); 

     do 
     { 
      bytesRead = responseStream.Read(data, 0, 1024 * 64); 
      totalBytesRead += bytesRead; 

      output.Append(Encoding.ASCII.GetString(data, 0, bytesRead)); 
     } 
     while (bytesRead > 0); 

     Console.WriteLine("total read: " + totalBytesRead); 
     Console.WriteLine("last content read: " + output.ToString()); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Clear(); 
     Response.ClearHeaders(); 
     Response.AddHeader("Content-Length", "13"); 
     Response.Write("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
    } 
} 

問題は解決します!

データを取得するサーバーはCognosサーバーで、文字列を圧縮するかのようにコンテンツの長さを計算していましたが、圧縮を受け付けることができるようにコードを送信していなかったため、圧縮されていないデータが圧縮の長さだけ戻されます。 IEは、圧縮を受け入れることができると述べたので、この問題はありませんでした。 コードの問題を修正するには:

request2.Headers.Add("Accept-Encoding", "gzip,deflate"); 
+0

あなた自身のために閲覧できるURLがありますか?私たちとコードを共有するように気をつけますか? –

答えて

3

問題が解決返すまでちょうど読書を保つ、サーバーのコンテンツの長さに依存しないでください!

データを取得するサーバーはCognosサーバーで、文字列を圧縮するかのようにコンテンツの長さを計算していましたが、圧縮を受け付けることができるようにコードを送信していなかったため、圧縮されていないデータが圧縮の長さだけ戻されます。 IEは、圧縮を受け入れることができると述べたので、この問題はありませんでした。問題を解決するコード:

request2.Headers.Add("Accept-Encoding", "gzip,deflate"); 
0

HttpWebRequestのだけが送るデータを、サーバから送信されたデータとは何の関係もありませんので、私はあなたがHttpWebResponseのを意味と仮定します。

HttpWebResponseは、サーバーから送信されたContent-Lengthについてまったく気にせず、情報目的でクライアントにHeadersプロパティでのみ提供します。応答ストリームからの読み取り時

あなたはStream.Readメソッドは0

+1

'Connection:Keep-Alive'のとき、' Stream.Read'はサーバがタイムアウトするまで0を返すとは思いません。 –

関連する問題