Gdzie jest HttpContent.ReadAsAsync?

283

Widzę w tonach przykładów w Internecie z użyciem nowego HttpClientobiektu (jako części nowego interfejsu API sieci Web), że powinna istnieć HttpContent.ReadAsAsync<T>metoda. Jednak MSDN nie wspomina o tej metodzie, ani IntelliSense jej nie znajduje.

Gdzie się podział i jak mam go obejść?

David Pfeffer
źródło

Odpowiedzi:

436

Wygląda na to, że jest to metoda rozszerzenia (w System.Net.Http.Formatting):

Klasa HttpContentExtensions

Aktualizacja:

PM> pakiet instalacyjny Microsoft.AspNet.WebApi.Client

Zgodnie ze stroną System.Net.Http.Formatting pakietu NuGet, System.Net.Http.Formattingpakiet jest już starszy i można go znaleźć w Microsoft.AspNet.WebApi.Clientpakiecie dostępnym w NuGet tutaj .

JOT...
źródło
Czy zostało to przestarzałe w najnowszym kliencie Nugets? Nie mogę go teraz znaleźć (kiedyś było to możliwe).
georgiosd
Może tak być. .NET4.5 dodał wiele nowych rzeczy w odniesieniu do asynchronizacji / zadań (czekaj itp.), Więc te rozszerzenia mogą nie być już potrzebne. Może zajrzę tutaj, na przykład: msdn.microsoft.com/en-us/library
...
4
@georgiosd Właśnie zaktualizowałem odpowiedź. Tymczasem System.Net.Http.Formattingwygląda na to, że został przeniesiony do pakietu nuget.org/packages/Microsoft.AspNet.WebApi.Client .
Joseph Woodward
1
Czy to prawda, że ​​metoda z pierwotnego pytania HttpContent.ReadAsAsync<T>nie znajduje się w Microsoft.AspNet.WebApi.Client? Jaka jest sugerowana zamiana?
Patrick Szalapski
1
@JedatKinports Całkiem pewne, że nie. Pakiet WebAPI.Client wymaga .NET 4.5. Myślę, że stare HttpContentExtensions były dla .NET 4.0
J ...
68

Mam ten sam problem, więc po prostu otrzymuję ciąg JSON i deserializuję do mojej klasy:

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);
rosta
źródło
8
Oprócz tego, że to nie odpowiada na pytanie, dlaczego to zostało odrzucone? Czy nie jest to rozsądna alternatywa dla ReadAsAsync?
Jess
7
Z pewnością jest! +1!
Mrchief
7
prawdopodobnie dlatego, że nie odpowiedziałeś na pytanie, gdzie poszła metoda rozszerzenia. Pisanie własnych jest kiepskim obejściem
BritishDeveloper
13
To niekoniecznie jest słabe obejście, jest zlokalizowane i dlatego prawdopodobnie nie zostanie zepsute w przyszłych aktualizacjach nugetów itp. Jestem za tym wszystkim.
rzuca
3
Zakłada się, że odpowiedź ma typ zawartości JSON.
CodeCaster
30

Jeśli już używasz Newtonsoft.Jsoni nie chcesz instalować Microsoft.AspNet.WebApi.Client:

 var myInstance = JsonConvert.DeserializeObject<MyClass>(
   await response.Content.ReadAsStringAsync());
Martin Brandl
źródło
9

Możesz napisać metodę rozszerzenia:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}
Vasya Milovidov
źródło
Tak właśnie skończyłem - nie zamierzam przeciągać całej biblioteki DLL dla metody 2-liniowej.
Liz
5

Wystarczy kliknąć projekt prawym przyciskiem myszy i przejść do Zarządzaj wyszukiwaniem pakietów NuGet dla Microsoft.AspNet.WebApi.Client, zainstaluj go, a będziesz mieć dostęp do metody rozszerzenia.

Ivan Carmenates García
źródło
3
Kto na co narzeka?
David Pfeffer
0

Po kilkukrotnym naciśnięciu tego przycisku i zastosowaniu się do kilku sugestii, jeśli po zainstalowaniu NuGet Microsoft.AspNet.WebApi.Client nie jest dostępny, ręcznie dodaj odwołanie z folderu pakietów w rozwiązaniu, aby:

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

I nie wpadnij w pułapkę dodawania starszych odniesień do System.Net.Http.Formatting.dll NuGet

Tom John
źródło