HttpWebResponse, и кусок http. Как прочитать один кусок? - PullRequest
0 голосов
/ 15 сентября 2010

На удаленном сервере есть двоичный файл, который я хочу передать своему клиенту.Я выдаю запрос GET, и ответом является заголовок HTTP + тело, содержащее двоичный файл, кусками.Проблема в том, что каждый блок содержит, а также двоичные данные, некоторые метаданные, которые мне нужны.

Как я могу прочитать только один блок за раз из потока HTTP с C #?

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Как уже отмечали другие, невозможно выполнить Read () и ожидать возврата одного куска данных.HTTP использует TCP, который является потоковым протоколом.Это означает, что если отправитель записал 1024 байта, то считыватель получит данные в 1024 чтениях по 1 байту или 1 чтении из 1024 байтов или чего-либо между ними.

Также по этой причине, даже снижениеСокеты не помогут, так как базовый протокол по-прежнему TCP.

ТАК, вы должны сделать это трудным путем.Вам нужно будет написать конечный автомат, который сначала сделает достаточно Read (), чтобы получить необходимое количество байтов, содержащих метаданные.Разобрать этот байтовый массив и получить метаданные.Затем поместите в буфер оставшиеся данные (если они есть) и продолжите чтение, чтобы получить часть данных.Вспенить, промыть, повторить ...

1 голос
/ 15 сентября 2010

Решение Ani не поможет вам, потому что ваша проблема не в потоковой передаче, а в получении доступа к оригинальным блокам на уровне протокола. Если метаданные не добавлены в возвращаемые заголовки, что, как я подозреваю, не так, ваш единственный выбор может состоять в том, чтобы перейти на уровень сокетов и реализовать свой собственный клиентский код HTTP. В зависимости от того, насколько вы можете ограничить функциональность и ваш собственный комфорт с протоколами, это может быть не так сложно.

редактировать

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

Теперь, если бы вы читали до и включая заголовок первого чанка, он содержал бы длину этого чанка, так что вы бы точно знали, сколько байтов вы можете прочитать до конца чанка. Я верю, но я не уверен, что если вы попытаетесь прочитать после конца этого блока, а следующий блок не будет отправлен, Socket.Receive прочитает столько, сколько сможет, и вернет фактическое число байтов. В любом случае, если вы будете осторожны, вы сможете начать обработку первого чанка, пока второй еще отправляется.

Это помогает?

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