Где находится HttpContent.ReadAsAsync?

283

Я вижу в тоннах примеров в Интернете, использующих новый HttpClientобъект (как часть нового веб-API), что должен быть HttpContent.ReadAsAsync<T>метод. Однако MSDN не упоминает этот метод, и IntelliSense не находит его.

Куда это делось, и как мне обойти это?

Дэвид Пфеффер
источник

Ответы:

437

Похоже, что это метод расширения (в System.Net.Http.Formatting):

Класс HttpContentExtensions

Обновить:

PM> установочный пакет Microsoft.AspNet.WebApi.Client

Согласно странице пакета NuGet System.Net.Http.Formatting , System.Net.Http.Formattingпакет теперь является устаревшим, и его можно найти в Microsoft.AspNet.WebApi.Clientпакете, доступном на NuGet здесь .

J ...
источник
Это было объявлено устаревшим в последних клиентских Nugets? Не могу найти его сейчас (раньше мог).
Георгиосд
Это вполне может быть. В .NET4.5 добавлено много нового, касающегося асинхронности / задач (ожидание и т. Д.), Поэтому в этих расширениях больше нет необходимости. Я, возможно, посмотрю здесь, например: msdn.microsoft.com/en-us/library/…
J ...
4
@georgiosd Я только что обновил ответ. В то же время, System.Net.Http.Formattingпохоже, что он перемещен в пакет nuget.org/packages/Microsoft.AspNet.WebApi.Client .
Джозеф Вудворд
1
Так правда ли, что метод, о котором идет речь в оригинальном вопросе, HttpContent.ReadAsAsync<T>отсутствует в Microsoft.AspNet.WebApi.Client? Какая замена предлагается?
Патрик Салапски
1
@JedatKinports Совершенно уверен, что это не так. Для пакета WebAPI.Client требуется .NET 4.5. Я думаю, что старые HttpContentExtensions были для .NET 4.0
J ...
68

У меня та же проблема, поэтому я просто получаю строку JSON и десериализую в свой класс:

HttpResponseMessage response = await client.GetAsync("Products");
//get data as Json string 
string data = await response.Content.ReadAsStringAsync();
//use JavaScriptSerializer from System.Web.Script.Serialization
JavaScriptSerializer JSserializer = new JavaScriptSerializer();
//deserialize to your class
products = JSserializer.Deserialize<List<Product>>(data);
РОСТА
источник
8
Помимо того, что это не отвечает на вопрос, почему это было отклонено? Разве это не разумная альтернатива ReadAsAsync?
Джесс
7
Это точно! +1!
Mrchief
7
вероятно, потому что вы не ответили на вопрос, куда делся метод расширения. Написание собственного - плохой обходной путь
BritishDeveloper
13
Это не обязательно плохой обходной путь, он локализован и, следовательно, вряд ли будет сломан в будущих обновлениях nuget и т. Д. Я за это.
катится
3
Это предполагает, что ответ имеет тип содержимого JSON.
CodeCaster
30

Если вы уже используете Newtonsoft.Jsonи не хотите устанавливать Microsoft.AspNet.WebApi.Client:

 var myInstance = JsonConvert.DeserializeObject<MyClass>(
   await response.Content.ReadAsStringAsync());
Мартин Брандл
источник
9

Вы можете написать метод расширения:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}
Вася Миловидов
источник
Это то, что я в итоге сделал - я не собираюсь перетаскивать целую DLL для двухстрочного метода.
Лиз
5

Просто щелкните правой кнопкой мыши в своем проекте иди Управление поиском пакетов NuGet для Microsoft.AspNet.WebApi.Client установите его, и вы получите доступ к методу расширения.

Иван Карменатес Гарсия
источник
3
Кто на что жалуется?
Дэвид Пфеффер
0

Попав несколько раз и следуя куче предложений, если вы не можете найти его доступным после установки NuGet Microsoft.AspNet.WebApi.Client вручную добавьте ссылку из папки с пакетами в решении, чтобы:

\Microsoft.AspNet.WebApi.Client.5.2.6\lib\net45\System.Net.Http.Formatting.dll

И не попадайтесь в ловушку добавления старых ссылок на NuGet System.Net.Http.Formatting.dll.

Том Джон
источник