Де HttpContent.ReadAsAsync?


283

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

Куди воно пішло і як я працюю навколо нього?

Відповіді:


436

Схоже, це метод розширення (у System.Net.Http.Formatting):

HttpContentExtensions Class

Оновлення:

PM> встановити пакет Microsoft.AspNet.WebApi.Client

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


Чи застаріло це в останніх клієнтських нугетах? Неможливо знайти його зараз (раніше).
georgiosd

Це цілком могло бути. .NET4.5 додав багато нових матеріалів щодо асинхронізації / завдань (очікувати тощо), тож ці розширення можуть більше не потрібні. Я, можливо, загляну
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
Це не обов'язково поганий спосіб вирішення, він локалізований і, отже, не може бути зламаний у майбутніх оновленнях чисел тощо. Я все за це.
булочки

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 Packages для пошуку 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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.