0

バッファの終了位置をアプリに伝えるために、コンテンツの長さを取得する必要があります。問題は、応答に Content-Length ヘッダーが表示されているにもかかわらず、httpwebresponse.ContentLength が -1 を返すことです。

次に、実際のヘッダーを読んで長さを調べます。私がテストしているページから返された Content-Length は 1646 です。HTTP スニファーは、1900 バイトを受信したと主張しているので、違いはヘッダーの長さであると推測します。それから私は応答から体全体をコピーしてオンラインのstrlenサイトに貼り付けました.体のサイズは実際には1850です!!

これはどのように可能ですか?応答が無効な content-length を返し、httpwebrequest.ContentLength が -1 を返すのはなぜですか? 応答自体を受信する前に、実際の応答の長さを計算するにはどうすればよいですか?

編集:これは、応答を取得するために使用しているコードです:

                  using (System.IO.Stream responseStream = hwresponse.GetResponseStream())
                  {
                      using (MemoryStream memoryStream = new MemoryStream())
                      {
                          int count = 0;
                          do
                          {
                              count = responseStream.Read(buffer, 0, buffer.Length);
                              TCP_R.SendBytes(buffer);

                          } while (count != 0);

                      }
                  }

                  byte[] PACKET_END_IDENTIFIER = { 0x8, 0x01, 0x8, 0x1, 0x8 };
                  TCP_R.SendBytes(PACKET_END_IDENTIFIER);
                  TCP_R.Close();

リクエストを受け取り、それを別のアプリケーション(クライアント)に送信するプロキシサーバーアプリケーションがあります。クライアントはリクエストを実行し、TCP_Rクラスを使用して結果を返します。サーバーがクライアントから応答を受け取ると、ブラウザーに応答を返します。

リクエストを行うたびに、すべてのデータと余分なガベージを取得します。例を次に示します。

<tag1><tag2><tag3> ag3> 

ag3> はガベージデータで、バッファの末尾が切り取られて追加されたようなものです。クライアントが有効な応答で応答するように見えます。ガベージ データが onDataRecieve イベントに追加されます。何かヒントはありますか? ありがとう!

4

1 に答える 1

7

-1 はContentLengthプロパティの無効な値ではありません。レスポンスContentLengthのプロパティが -1であることを意味していると思います...リクエストに長さを尋ねるのは無意味です。それでも、それは完全に有効です:

ContentLength プロパティには、応答で返される Content-Length ヘッダーの値が含まれます。応答で Content-Length ヘッダーが設定されていない場合、ContentLength は値 -1 に設定されます。

本文の長さが 1850 の場合は、チャンク転送エンコーディングを使用していることを示しています。しかし、それは透過的であるべきです - 応答ストリームから最後まで読み続けてください。.NET 4 を使用している場合は、非常に簡単です。 を作成し、MemoryStreamを使用Stream.CopyToしてデータをその にコピーするだけですMemoryStream

于 2012-02-26T22:38:17.083 に答える