Прогресс HTTP в .Net Compact Framework

Я работаю над приложением, которое делает много HTTP-запросов «веб-сервисов», некоторые из которых могут быть довольно большими XML-файлами. Прямо сейчас HTTP-запрос выполняется во втором потоке, поэтому графический интерфейс/форма не заблокированы. Но он по-прежнему не может предоставить пользователю обратную связь о ходе выполнения запроса.

До сих пор я использовал класс HTTPWebRequest для этой работы, и все мои исследования указывают на то, что он не выполняет обратные вызовы с отчетами о ходе выполнения ASync, пока он не будет завершен.

В ближайшем будущем это приложение должно будет загружать большие файлы .jpg и .zip через 3G/GPRS. Без индикатора выполнения или какого-либо типа обратной связи это будет очень неприятно использовать.

Есть ли какая-либо другая (возможно, сторонняя) структура или класс, который я могу использовать?

Пожалуйста, не публикуйте код, который работает на Desktop .Net, и предполагайте, что он работает на CF, спасибо.


person Alex    schedule 03.03.2009    source источник


Ответы (2)


Имейте в виду, что если XML-файл отправляется с HTTP-заголовком «Transfer-Encoding: chunked», HTTP не сообщает вам, насколько большим будет файл.

person Robert Lewis    schedule 05.03.2009
comment
Даже не зная окончательной Content-Length... было бы неплохо дать пользователю обратную связь о прогрессе. - person Alex; 10.03.2009

Вы можете перехватить поток байтов, поступающих с сервера, с помощью такого кода:

HttpWebResponse response = request.GetResponse();

Stream responseStream = response.GetResponseStream();

Затем вы можете обернуть поток ответа в свой собственный класс, который читает из потока HTTP и сообщает, сколько байтов было получено через событие. Вам нужно будет запустить свой собственный отдельный поток, чтобы он работал, и вам нужно будет явно записать содержимое потока в файл. (Я не пробовал это в CF, но эти методы задокументированы как работающие для CF.)

person Robert Lewis    schedule 11.03.2009