Wo ist HttpContent.ReadAsAsync?

283

Ich sehe in Tonnen von Beispielen im Web, die das neue HttpClientObjekt (als Teil der neuen Web-API) verwenden, dass es eine HttpContent.ReadAsAsync<T>Methode geben sollte . Allerdings MSDN ist diese Methode nicht erwähnt, noch IntelliSense es finden.

Wo ist es hingegangen und wie arbeite ich daran?

David Pfeffer
quelle

Antworten:

436

Es sieht so aus, als wäre es eine Erweiterungsmethode (in System.Net.Http.Formatting):

HttpContentExtensions-Klasse

Aktualisieren:

PM> Installationspaket Microsoft.AspNet.WebApi.Client

Laut der System.Net.Http.Formatting NuGet- Paketseite ist das System.Net.Http.FormattingPaket jetzt Legacy und befindet sich stattdessen in dem Microsoft.AspNet.WebApi.Clientauf NuGet hier verfügbaren Paket .

J ...
quelle
Wurde dies in den neuesten Client-Nugets nicht mehr empfohlen? Kann es jetzt nicht finden (war früher in der Lage).
Georgiosd
Es könnte gut sein. .NET4.5 hat viele neue Dinge in Bezug auf Async / Tasks (Warten usw.) hinzugefügt, sodass diese Erweiterungen möglicherweise nicht mehr erforderlich sind. Ich würde vielleicht hier einen Blick darauf werfen, zum Beispiel: msdn.microsoft.com/en-us/library/…
J ...
4
@georgiosd Ich habe gerade die Antwort aktualisiert. In der Zwischenzeit System.Net.Http.Formattingsieht es so aus, als wäre es in das Paket nuget.org/packages/Microsoft.AspNet.WebApi.Client verschoben worden .
Joseph Woodward
1
Stimmt es also, dass die Methode in der ursprünglichen Frage HttpContent.ReadAsAsync<T>nicht in Microsoft.AspNet.WebApi.Client enthalten ist? Was ist der vorgeschlagene Ersatz?
Patrick Szalapski
1
@JedatKinports Ganz sicher nicht. Für das WebAPI.Client-Paket ist .NET 4.5 erforderlich. Ich denke, die alten HttpContentExtensions waren für .NET 4.0
J ...
68

Ich habe das gleiche Problem, daher erhalte ich einfach einen JSON-String und deserialisiere ihn in meine Klasse:

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
quelle
8
Abgesehen von der Tatsache, dass dies die Frage nicht beantwortet, warum wurde dies abgelehnt? Ist es nicht eine vernünftige Alternative zu ReadAsAsync?
Jess
7
Es ist sicher! +1!
Mrchief
7
wahrscheinlich, weil Sie die Frage, wohin die Erweiterungsmethode gegangen ist, nicht beantwortet haben. Das Schreiben Ihrer eigenen ist eine schlechte
Problemumgehung
13
Es ist nicht unbedingt eine schlechte Problemumgehung, es ist lokalisiert und daher wahrscheinlich nicht in zukünftigen Nuget-Updates usw. kaputt. Ich bin alles dafür.
rollt
3
Dies setzt voraus, dass die Antwort einen JSON-Inhaltstyp hat.
CodeCaster
30

Wenn Sie bereits verwenden Newtonsoft.Jsonund nicht installieren möchten Microsoft.AspNet.WebApi.Client:

 var myInstance = JsonConvert.DeserializeObject<MyClass>(
   await response.Content.ReadAsStringAsync());
Martin Brandl
quelle
9

Sie können eine Erweiterungsmethode schreiben:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}
Vasya Milovidov
quelle
Es ist das, was ich letztendlich getan habe - ich werde nicht eine ganze DLL für eine zweizeilige Methode ziehen.
Liz
5

Klicken Sie einfach mit der rechten Maustaste in Ihr Projekt. Gehen Sie zur Suche nach NuGet-Paketen und suchen Sie nach Microsoft.AspNet.WebApi.Client. Installieren Sie es und Sie haben Zugriff auf die Erweiterungsmethode.

Ivan Carmenates García
quelle
3
Wer beschwert sich über was?
David Pfeffer
0

Nachdem Sie dies einige Male getroffen und eine Reihe von Vorschlägen befolgt haben, können Sie nach dem Installieren von NuGet Microsoft.AspNet.WebApi.Client manuell einen Verweis aus dem Paketordner in der Lösung hinzufügen, um:

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

Und geraten Sie nicht in die Falle, ältere Verweise zum System.Net.Http.Formatting.dll NuGet hinzuzufügen

Tom John
quelle