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.