HttpWebRequest.BeginGetResponse завершается слишком поздно - PullRequest
2 голосов
/ 12 июля 2011

Я использую в своем коде вызовы метода 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-запросы, которые я делаю на сервер, приводят к выводу файлов.

Спасибо!
Михай

1 Ответ

3 голосов
/ 12 июля 2011

Вам необходимо отключить буферизацию ответов, если вы хотите передавать данные вниз.Вы можете сделать это, установив AllowReadStreamBuffering в false.

HttpWebRequest myHttpWebRequest = WebRequest.CreateHttp(m_getUrl);
myHttpWebRequest.Method = "GET";
myHttpWebRequest.AllowReadStreamBuffering = false;
...