Где находится 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 здесь .


Это было объявлено устаревшим в последних клиентских 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.