Où se trouve HttpContent.ReadAsAsync?


283

Je vois dans des tonnes d'exemples sur le Web en utilisant le nouvel HttpClientobjet (dans le cadre de la nouvelle API Web) qu'il devrait y avoir une HttpContent.ReadAsAsync<T>méthode. Cependant, MSDN ne mentionne pas cette méthode et IntelliSense ne la trouve pas.

Où est-il allé et comment contourner ce problème?

Réponses:


436

Il semble que ce soit une méthode d'extension (dans System.Net.Http.Formatting):

Classe HttpContentExtensions

Mettre à jour:

PM> package d'installation Microsoft.AspNet.WebApi.Client

Selon la page du package System.Net.Http.Formatting NuGet, le System.Net.Http.Formattingpackage est désormais hérité et peut être trouvé à la place dans le Microsoft.AspNet.WebApi.Clientpackage disponible sur NuGet ici .


Cela a-t-il été déconseillé dans les derniers clients Nugets? Je ne le trouve pas maintenant (auparavant).
— georgiosd

Ça pourrait bien l'être. .NET4.5 a ajouté beaucoup de nouvelles choses en ce qui concerne les tâches asynchrones / (attendez, etc.), donc ces extensions peuvent ne plus être nécessaires. J'aurais peut-être un coup d'oeil ici, par exemple: msdn.microsoft.com/en-us/library/…
— J ...

4
@georgiosd Je viens de mettre à jour la réponse. En attendant, il System.Net.Http.Formattingsemble avoir été déplacé vers le package nuget.org/packages/Microsoft.AspNet.WebApi.Client .
— Joseph Woodward

1
Est-il donc vrai que la méthode de la question d'origine HttpContent.ReadAsAsync<T>, n'est pas dans Microsoft.AspNet.WebApi.Client? Quel est le remplacement suggéré?
— Patrick Szalapski

1
@JedatKinports Bien sûr que non. Le package WebAPI.Client nécessite .NET 4.5. Je pense que les anciens HttpContentExtensions étaient pour .NET 4.0
— J ...

68

J'ai le même problème, donc je récupère simplement la chaîne JSON et désérialise dans ma 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
Mis à part le fait que cela ne répond pas à la question, pourquoi cela a-t-il été rejeté? N'est-ce pas une alternative raisonnable à ReadAsAsync?
— Jess

7
Tout à fait! +1!
— Mrchief

7
probablement parce que vous n'avez pas répondu à la question de savoir où est passée la méthode d'extension. Écrire votre propre est une mauvaise solution
— BritishDeveloper

13
Ce n'est pas nécessairement une mauvaise solution de contournement, il est localisé et ne risque donc pas de se casser dans les futures mises à jour de pépites, etc. Je suis tout à fait d'accord.
— roule le

3
Cela suppose que la réponse a un type de contenu JSON.
— CodeCaster

30

Si vous utilisez déjà Newtonsoft.Jsonet ne souhaitez pas installer Microsoft.AspNet.WebApi.Client:

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

9

Vous pouvez écrire la méthode d'extension:

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

C'est ce que j'ai fini par faire - je ne vais pas faire glisser une DLL entière pour une méthode sur 2 lignes.
— Liz

5

Faites un clic droit dans votre projet, allez sur Gérer les packages NuGet, recherchez Microsoft.AspNet.WebApi.Client, installez-le et vous aurez accès à la méthode d'extension.


3
Qui se plaint de quoi?
— David Pfeffer

0

Après avoir frappé celui-ci plusieurs fois et suivi un tas de suggestions, si vous ne le trouvez pas disponible après l'installation de NuGet Microsoft.AspNet.WebApi.Client, ajoutez manuellement une référence du dossier packages dans la solution à:

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

Et n'entrez pas dans le piège d'ajouter des références plus anciennes à NuGet System.Net.Http.Formatting.dll

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.