Я пытался написать простой 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-запрос в одном месте в крошечной библиотеке.
Если вы используете общую 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
}
GetResponseAsync
. Не уверен, что это доступно в PCL, хотя. Пакет System.Net.HttpClient NuGet, вероятно, является лучшим выбором, чем использованиеHttpWebRequest
.System.Net.Http.HttpClient
( nuget.org/packages/Microsoft.Net.Http ).