HttpWebRequest недопустимая длина содержимого - PullRequest
0 голосов
/ 27 февраля 2012

Мне нужно получить длину контента, чтобы сообщить моему приложению, где заканчивается буфер. Проблема в том, что httpwebresponse.ContentLength возвращает -1, даже если в ответе представлен заголовок Content-Length.

Тогда я собираюсь прочитать фактический заголовок, чтобы узнать длину. Длина содержимого, возвращаемая страницей, на которой я тестирую, равна 1646. Анализатор HTTP утверждает, что я получил 1900 байт, поэтому я предполагаю, что разница заключается в длине заголовка. Затем я скопировал все тело из ответа и вставил его в онлайн-сайт strlen, и его размер на самом деле равен 1850 !!

Как это возможно? Почему ответ возвращает недопустимую длину содержимого и почему httpwebrequest.ContentLength возвращает -1? Как я могу рассчитать фактическую длину ответа до получения самого ответа?

EDIT: Вот код, который я использую, чтобы получить ответ:

                  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> - это данные мусора, это похоже на то, что конец буфера обрезан и добавлен снова. Опасно, что клиент отвечает правильным ответом, мусорные данные добавляются в событие DataDecieve .. какие-нибудь советы? спасибо!

1 Ответ

7 голосов
/ 27 февраля 2012

-1 не является недопустимым значением свойства ContentLength. Я предполагаю, что вы имеете в виду, что свойство ContentLength ответа равно -1 ... спрашивая запрос , какая длина будет бессмысленной. Тем не менее, это совершенно верно:

Свойство ContentLength содержит значение заголовка Content-Length, возвращенного с ответом. Если заголовок Content-Length не установлен в ответе, ContentLength устанавливается в значение -1. ​​

Если длина тела равна 1850, это означает, что он использует кодирование передачи по частям . Но это должно быть прозрачным для вас - просто продолжайте чтение из потока ответов до конца. Если вы используете .NET 4, это очень просто - просто создайте MemoryStream и используйте Stream.CopyTo, чтобы скопировать данные в этот MemoryStream.

...