Я пытаюсь прочитать поток потоковых уведомлений EWS в асинхронном режиме в WinHTTP, но у меня возникают проблемы при чтении всего фрагмента - не меньше, не больше.
Если я использую обратный вызов WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
, я получаю меньше данных, чем сервер отправляет в чанке, и WinHttpReadData
запускает обратный вызов WINHTTP_CALLBACK_STATUS_READ_COMPLETE
только с запрошенными мной данными.Если я запрашиваю больше (например, фиксированный размер буфера 8 КБ), WINHTTP_CALLBACK_STATUS_READ_COMPLETE
не срабатывает, пока не будет возвращен весь буфер, что означает, что он будет ждать следующего уведомления (всякий раз, когда оно придет), прежде чем возвращать какие-либо данные.
Я действительно не хочу прибегать к чтению одного байта за раз, пока не получу хорошо отформатированный XML;Я хочу получить данные на уровне WinHTTP без знания его формата.
Подробнее:
Когда срабатывает обратный вызов WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE
, я звоню WinHttpReceiveResponse
чтобы начать прослушивание ответа с сервера.
Когда срабатывает WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
, я проверяю код состояния HTTP и вызываю WinHttpQueryDataAvailable
.
WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
запускает и сообщает мне, сколько данных доступно.Я звоню WinHttpReadData
, указывая, что размер данных
WINHTTP_CALLBACK_STATUS_READ_COMPLETE
срабатывает и выдает мне запрошенные данные.
Что мне делать дальше?Звоните WinHttpQueryDataAvailable
снова?Но как я узнаю, какой размер порции?Есть ли способ запросить запрос, чтобы выяснить размер текущего чанка?