Dov'è HttpContent.ReadAsAsync?


283

Vedo in tonnellate di esempi sul web usando il nuovo HttpClientoggetto (come parte della nuova API Web) che dovrebbe esserci un HttpContent.ReadAsAsync<T>metodo. Tuttavia, MSDN non menziona questo metodo, né IntelliSense lo trova.

Dove è andato e come posso aggirarlo?

Risposte:


436

Sembra che sia un metodo di estensione (in System.Net.Http.Formatting):

Classe HttpContentExtensions

Aggiornare:

PM> pacchetto di installazione Microsoft.AspNet.WebApi.Client

Secondo la pagina del pacchetto NuGet di System.Net.Http.Formatting , il System.Net.Http.Formattingpacchetto è ora legacy e può invece essere trovato nel Microsoft.AspNet.WebApi.Clientpacchetto disponibile su NuGet qui .


Questo è stato deprecato negli ultimi client Nugets? Non riesco a trovarlo ora (era solito).
georgiosd,

Potrebbe essere. .NET4.5 ha aggiunto molte nuove cose per quanto riguarda asincrono / attività (wait, ecc.), Quindi queste estensioni potrebbero non essere più necessarie. Potrei dare un'occhiata qui, ad esempio: msdn.microsoft.com/en-us/library/…
J ...

4
@georgiosd Ho appena aggiornato la risposta. Nel frattempo System.Net.Http.Formattingsembra che sia stato spostato nel pacchetto nuget.org/packages/Microsoft.AspNet.WebApi.Client .
Joseph Woodward,

1
Quindi è vero che il metodo nella domanda originale HttpContent.ReadAsAsync<T>non è in Microsoft.AspNet.WebApi.Client? Qual è la sostituzione suggerita?
Patrick Szalapski,

1
@JedatKinports Sicuro che non lo sia. Il pacchetto WebAPI.Client richiede .NET 4.5. Penso che le vecchie HttpContentExtensions fossero per .NET 4.0
J ...

68

Ho lo stesso problema, quindi ottengo semplicemente la stringa JSON e deserializzo la mia classe:

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
A parte il fatto che questo non risponde alla domanda, perché è stato votato? Non è un'alternativa ragionevole a ReadAsAsync?
Jess,

7
Lo è di sicuro! +1!
Mrchief,

7
probabilmente perché non hai risposto alla domanda su dove è andato il metodo di estensione. Scrivere il tuo è una soluzione scadente
British Devevoper

13
Non è necessariamente una soluzione scadente, è localizzata e quindi non si romperà in futuri aggiornamenti di nuget ecc. Sono tutto per questo.
tira il

3
Ciò presuppone che la risposta abbia un tipo di contenuto JSON.
CodeCaster

30

Se stai già utilizzando Newtonsoft.Jsone non vuoi installare Microsoft.AspNet.WebApi.Client:

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

9

Puoi scrivere il metodo di estensione:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}

È quello che ho finito per fare: non trascinerò un'intera DLL per un metodo a 2 righe.
Liz,

5

Basta fare clic con il tasto destro del mouse sul progetto per gestire Gestisci pacchetti NuGet per la ricerca di Microsoft.AspNet.WebApi.Client e installarlo e avrai accesso al metodo di estensione.


3
Chi si lamenta di cosa?
David Pfeffer,

0

Dopo averlo colpito alcune volte e seguito una serie di suggerimenti, se non lo trovi disponibile dopo l'installazione di NuGet Microsoft.AspNet.WebApi.Client aggiungi manualmente un riferimento dalla cartella dei pacchetti nella soluzione a:

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

E non entrare nella trappola dell'aggiunta di riferimenti meno recenti al NuGet System.Net.Http.Formatting.dll

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.