Получить заголовки HTTP в асинхронном запросе WebClient - PullRequest
6 голосов
/ 13 октября 2010

Я использую System.Net.WebClient для выполнения некоторых операций HTTP в асинхронном режиме.Причиной использования асинхронных операций является, прежде всего, тот факт, что я получаю индикаторы изменения прогресса - который доступен только для асинхронных операций, как указано в документах .

Так скажемУ меня настроен WebClient:

this.client = new WebClient();
this.client.UploadStringCompleted +=
    new UploadStringCompletedEventHandler(textUploadComplete);

и делегат:

private void textUploadComplete(Object sender, UploadStringCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // trigger UI failure notification
        return;
    }

    // FIXME not checking for response code == 200 (OK)
    // trigger UI success notification
}

Итак, вы видите, я предполагаю, что если не возникает исключение, запросы всегда выполняются успешно (что может быть не так, поскольку код состояния ответа HTTP может быть! = 2xx).Из документации по UploadFileAsync Я не могу сказать, обрабатывается ли ответ не 200.

Я действительно новый для C #, и я могу 'Похоже, что нет способа получить доступ к заголовкам для ответа этого конкретного асинхронного запроса.Мне кажется, что каждый WebClient может содержать только ответ (или набор заголовков) в любой момент времени.

Хотя я не собираюсь выполнять несколько параллельных запросов одновременно, я 'Мне все еще хотелось бы узнать, существует ли более элегантный способ получения заголовков / кода статуса конкретного запроса, вместо того, чтобы получать ответ «последний доступный» от WebClient.

Спасибо.

1 Ответ

0 голосов
/ 03 мая 2014

Вы в .NET 4.5?Если это так, попробуйте использовать перегрузки TaskAsync ... вам все равно потребуется доступ к заголовкам из экземпляра WebClient, но я не нахожу это нежелательным при использовании рабочего процесса TAP ... Я согласен, что это немного неправильно делать вобычный обработчик событий.

await client.UploadStringTaskAsync(...); 
var headers = client.ResponseHeaders; 

Лучше всего вы можете делать все это в потоке пользовательского интерфейса ... не блокировать ... поэтому ваш "триггер обновления пользовательского интерфейса" на самом деле просто "обновление пользовательского интерфейса".

...