Как я могу использовать System.Net.HttpWebRequest с async / await?

1

Я пытался написать простой HTTP-клиент в качестве библиотеки портативных классов с минимальными зависимостями, что заставило меня подумать, что я должен использовать System.Net.HttpWebRequest.

Я просмотрел документацию, но он показывает только GetResponse/GetResponseStream, которых у меня нет в моей реализации. У меня только BeginGetResponse, BeginGetResponseStream и т.д. Я попытался использовать Task.Factory.FromAsync чтобы преобразовать это в Task, но это возвращает только Task, а не Task<HttpWebResponse>.

Правильный ли здесь подход к использованию, например:

var response = (Task<HttpWebResponse>)Task.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse);

Или я чего-то не хватает?

edit: Я не хочу вводить зависимости для дополнительных пакетов NuGet, так как все, что мне нужно сделать, это один HTTP-запрос в одном месте в крошечной библиотеке.

  • 0
    Вы должны использовать GetResponseAsync . Не уверен, что это доступно в PCL, хотя. Пакет System.Net.HttpClient NuGet, вероятно, является лучшим выбором, чем использование HttpWebRequest .
  • 1
    Я настоятельно рекомендую использовать System.Net.Http.HttpClient ( nuget.org/packages/Microsoft.Net.Http ).
Показать ещё 6 комментариев
Теги:
asynchronous
portable-class-library

1 ответ

1
Лучший ответ

Если вы используете общую Task<>.Factory вы получаете немного больше безопасности типов:

var request = WebRequest.CreateHttp("https://www.google.com");
object state = null; // or whatever state you want.
var task = Task<WebResponse>.Factory.FromAsync(
    request.BeginGetResponse,
    request.EndGetResponse, 
    state);

Однако, как и в случае, когда вы не выполняете async вызовы, если вы хотите HttpWebResponse а не только WebResponse, вам нужно сделать дополнительный бросок. И не забудьте закрыть/удалить свой ответ:

using (var response = (HttpWebResponse) (await task))
{
    // use response
}
  • 0
    Это именно то, что я искал, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню