HttpWebResponse.GetResponseStream (): когда передается тело ответа? - PullRequest
4 голосов
/ 10 июля 2011

Я использую класс System.Net.HttpWebRequest для реализации простого загрузчика HTTP, который можно приостанавливать, отменять и даже возобновлять после его отмены (с заголовком запроса диапазона HTTP).

Понятно, что HttpWebRequest.GetResponse () - это когда HTTP-запрос фактически отправляется на сервер, а метод возвращается, когда получен HTTP-ответ (или истекло время ожидания).Тем не менее, тело ответа представлено в виде потока, что заставляет меня задаться вопросом, действительно ли тело ответа передается с заголовком ответа (т.е. оно уже загружено, когда GetResponse () возвращается), или оно загружается только по требованию, когда я пытаюсьчитать из потока ответов?Или, может быть, когда я вызываю метод HttpWebResponse.GetResponseStream ()?

К сожалению, документация msdn не сообщает, и я не знаю достаточно о протоколе HTTP, чтобы иметь возможность сказать.

Как в этом случае ведут себя фрагментированные переводы и тому подобное (то есть, как я должен обрабатывать их в моем приложении C #)?Когда на самом деле данные ответа загружаются с сервера?

1 Ответ

5 голосов
/ 10 июля 2011

Все зависит от TCP, базового протокола HTTP. TCP работает так, что данные отправляются в сегментах. Всякий раз, когда клиент отправляет сегмент на сервер, среди отправленных данных есть информация о том, сколько дополнительных данных он готов получить. Это обычно соответствует некоторому буферу со стороны клиента. Когда клиент получает некоторые данные, он также отправляет сегмент на сервер, подтверждая полученные данные.

Итак, если клиент очень медленно обрабатывает полученные данные, последовательность событий может выглядеть следующим образом:

  1. Соединение установлено, клиенты говорят, сколько данных оно готово получить.
  2. Сервер отправляет один или несколько сегментов клиенту, общее количество данных в них не превышает того количества, которое клиент сказал, что готов получить
  3. Клиент говорит серверу: я получил данные, которые вы мне отправили, но пока не отправляю меня.
  4. Клиент обрабатывает некоторые данные.
  5. Клиент говорит серверу: Вы можете отправить мне еще x байтов данных

Что это значит в отношении GetResponse()? Когда вы вызываете GetResponse(), клиент отправляет запрос, читает HTTP-заголовок ответа (который обычно помещается в один сегмент, но может быть больше) и возвращает результат. На этом этапе, если вы не начинаете читать поток ответов (который вы получаете, вызывая GetResponseStream()), некоторые данные с сервера принимаются, но только для заполнения буфера. Когда он заполнен, данные больше не передаются, пока вы не начнете читать поток ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...