Я использую в своем коде вызовы метода HttpWebRequest.BeginGetResponse () для получения данных с моего сервера. Сервер производит контент, который может варьироваться от нескольких КБ до нескольких ГБ.
Моя проблема в том, что HttpWebRequest.BeginGetResponse завершается слишком поздно. Он должен завершиться сразу после установления соединения с сервером и получения заголовка HTTP.
Вот пример кода с использованием метода GET:
public bool StartDownload()
{
try
{
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(m_getUrl);
myHttpWebRequest.Method = "GET";
// Start the asynchronous request.
m_requestState = new RequestState();
m_requestState.request = myHttpWebRequest;
myHttpWebRequest.BeginGetResponse(new AsyncCallback(ResponseCompleted), m_requestState);
}
catch (Exception)
{
m_requestState = null;
}
return m_requestState != null;
}
private void ResponseCompleted(IAsyncResult result)
{
RequestState myRequestState = (RequestState)result.AsyncState;
HttpWebRequest myHttpWebRequest = myRequestState.request;
m_logger.LogMessage("ResponseCompleted notification received!");
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(result);
}
catch (Exception)
{
}
.......
}
Например, я запускаю код, используя "http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.1.tar.bz2", и результат выглядит так:
hh:mm:ss.ms
12:51:30.9440000 - Download started!
12:53:04.8520000 - ResponseCompleted notification received!
12:53:04.8560000 - Header received!
12:53:04.8570000 - DataReceived: 524288 bytes
.........................................
12:53:04.8940000 - DataReceived: 78818 bytes
12:53:04.8940000 - Request data received!
12:53:04.8940000 - Received bytes: 76100578
Проблема может быть легко обнаружена в журнале. Невозможно потратить больше одной минуты на подключение и 38 мс для загрузки около 72,5 МБ.
Кажется, что данные загружаются где-то на телефоне, и уведомление RequestComplete отправляется приложению только тогда, когда полный контент доступен локально. Это не нормально для меня, потому что мне нужно показать прогресс для операции.
Я получаю одинаковый результат на устройстве и эмуляторе для WP7 (также на WP7.1).
Я выполняю тот же код на рабочем столе Windows, и он работает правильно: запрос завершается в течение одной секунды, а остальная часть загрузки занимает около 1-2 минут.
Есть ли решение для WP7 или WP 7.1?
Недавно представленный WP 7.1 API «Передача фоновых файлов» не помогает, потому что мне нужен полный контроль над заголовками HTTP и контентом. Не все HTTP-запросы, которые я делаю на сервер, приводят к выводу файлов.
Спасибо!
Михай