'System.Net.Http.HttpContent' ne contient pas de définition pour 'ReadAsAsync' et aucune méthode d'extension

98

J'ai créé une application console pour consommer une API Web que je viens de créer. Le code de l'application console ne se compile pas. Cela me donne l'erreur de compilation:

'System.Net.Http.HttpContent' does not contain a definition for 
'ReadAsAsync' and no extension method 'ReadAsAsync' accepting a 
first argument of type 'System.Net.Http.HttpContent' could be 
found (are you missing a using directive or an assembly reference?)

Voici une méthode de test dans laquelle cette erreur se produit.

static IEnumerable<Foo> GetAllFoos()
{
  using (HttpClient client = new HttpClient())
  {
    client.DefaultRequestHeaders.Add("appkey", "myapp_key");

    var response = client.GetAsync("http://localhost:57163/api/foo").Result;

    if (response.IsSuccessStatusCode)
      return response.Content.ReadAsAsync<IEnumerable<Foo>>().Result.ToList();
  }

  return null;
}

J'ai utilisé cette méthode et l'ai consommée à partir d'un client MVC.

Refroidisseur d'eau v2
la source

Réponses:

140

Après une longue lutte, j'ai trouvé la solution.

Solution: ajoutez une référence à System.Net.Http.Formatting.dll. Cet assembly est également disponible dans le dossier C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

La méthode ReadAsAsyncest une méthode d'extension déclarée dans la classe HttpContentExtensions, qui se trouve dans l'espace System.Net.Httpde noms de la bibliothèque System.Net.Http.Formatting.

Reflector est venu à la rescousse!

Refroidisseur d'eau v2
la source
7
Des réponses personnelles qui aident les autres à faire vibrer les banlieues
grenadeCoder
Comment avez-vous obtenu ce dossier là-bas? J'ai utilisé le programme d'installation de la plate-forme Web et il n'a pas créé ce dossier dans Program Files.
bladefist
5
Ajouter une référence -> Assemblages -> Extensions. S'il ne figure pas dans la liste, accédez à la zone Rechercher les assemblages et tapez «mise en forme». J'espère que cela vous sera plus facile.
FrankO
1
Une mise à jour, j'ai trouvé la mienne ici: C: \ Program Files (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph
6
nuget.org/packages/System.Net.Http.Formatting.Extension - une raison de ne pas l'utiliser?
WernerCD
93

Assurez-vous que vous avez installé le correct NuGet packagedans votre application console:

<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />

et que vous ciblez au moins .NET 4.0.

Ceci étant dit, votre GetAllFoosfonction est définie pour renvoyer un IEnumerable<Prospect>alors que dans votre ReadAsAsyncméthode vous passez IEnumerable<Foo>des types qui ne sont évidemment pas compatibles.

Install-Package Microsoft.AspNet.WebApi.Client

Sélectionnez le projet dans la console du gestionnaire de projet

Darin Dimitrov
la source
Merci. C'était une erreur, un vestige de mes efforts pour supprimer le code lié à l'entreprise et le remplacer par Foos.
Water Cooler v2
Je ne comprends pas. Je cible déjà le framework .NET 4.0 dans les propriétés de mon application Console. Dois-je définir une référence à cette bibliothèque Microsoft.AspNet.WebAPI.Client.dll? Je n'ai jamais défini une telle référence dans le projet ASP.NET MVC qui consomme également mon API Web et fonctionne très bien.
Water Cooler v2
5
Vous devez installer Microsoft.AspNet.WebApi.ClientNuGet. Cela téléchargera la dernière version sur Internet et référencera l'assemblage dans votre application console. C'est exactement ce que fait le modèle de projet ASP.NET MVC et c'est la raison pour laquelle vous n'avez rien à installer pour qu'il fonctionne. Mais dans votre application console, il n'y a rien de tel.
Darin Dimitrov
1
Merci. J'ai fait ce que tu as dit. J'ai 12 projets dans ma solution, mais pour une raison étrange, après avoir dit `` install-package Microsoft.AspNet.WebApi.Client '' dans la console Library Package Manager, il a imprimé sa trace habituelle puis a déclaré `` Microsoft.AspNet a été installé avec succès. .WebApi.Client dans MyMVCProjectNameAndNotMyConsoleProjectName '. La prochaine fois que j'ai sélectionné mon projet Console et saisi la même chose dans la console du gestionnaire de packages. Il a déclaré que MyMVCProjectName faisait déjà référence à Microsoft.AspNet.WebApi.Client. Je suis confus.
Refroidisseur d'eau v2
Ouais moi aussi. Commencer à partir de zéro. Nouvelle application console, ouvrez la console NuGet, tapez Install-Package Microsoft.AspNet.WebApi.Clientet essayez le code.
Darin Dimitrov
21
  • si vous ne parvenez pas à trouver la référence d'assemblage à partir de quand (clic droit sur la référence -> ajouter l'assemblage requis)

essayez cette console du gestionnaire de packages
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3, puis ajoutez à l'aide de l'ajout de référence.

Ganganath Rathnasekara
la source
2
J'étais en train de migrer l'application dotnetcore de la version 2.2 vers la version 3.1 la plus récente et j'ai rencontré cette erreur.Mon application faisant déjà référence à System.Net.Http.Formatting.Extension v5.2.3 mais mon application se plaint de cette erreur, j'ai donc installé le package nuget Microsoft.AspNet.WebApi .Client comme suggéré par Rikin et Darin et après que le problème soit résolu. Merci
AKS
12

L'ajout d'une référence à System.Net.Http.Formatting.dll peut provoquer des problèmes d'incompatibilité DLL. À l'heure actuelle, System.Net.Http.Formatting.dll semble faire référence à la version 4.5.0.0 de Newtonsoft.Json.DLL, alors que la dernière version est 6.0.0.0. Cela signifie que vous devrez également ajouter une redirection de liaison pour éviter une exception d'assembly .NET si vous référencez le dernier package ou DLL Newtonsoft NuGet:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
 </dependentAssembly> 

Une solution alternative à l'ajout d'une référence à System.Net.Http.Formatting.dll consiste donc à lire la réponse sous forme de chaîne, puis à vous désaraliser avec JsonConvert.DeserializeObject (responseAsString). La méthode complète serait:

public async Task<T> GetHttpResponseContentAsType(string baseUrl, string subUrl)
{
     using (var client = new HttpClient())
     {
         client.BaseAddress = new Uri(baseUrl);
         client.DefaultRequestHeaders.Accept.Clear();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

         HttpResponseMessage response = await client.GetAsync(subUrl);
         response.EnsureSuccessStatusCode();
         var responseAsString = await response.Content.ReadAsStringAsync();
         var responseAsConcreteType = JsonConvert.DeserializeObject<T>(responseAsString);
         return responseAsConcreteType;
      }
}
Conor Kelly
la source
9

ou si vous avez VS 2012, vous pouvez accéder à la console du gestionnaire de packages et saisir Install-Package Microsoft.AspNet.WebApi.Client

Cela téléchargerait la dernière version du package

RAM
la source
Cela a réglé le problème pour moi. - en utilisant VS2013
Dan Rayson
si vous avez déjà un package Microsoft.AspNet.WebApi.Client, essayez de désinstaller et de l'installer, cela a résolu mon problème pour la version 5.2.3
Naveen
-1

UTILISEZ cette référence d'assemblage dans votre projet

Add a reference to System.Net.Http.Formatting.dll
Debendra Dash
la source
6
La réponse acceptée de janvier 2013 l'explique déjà et contient plus d'informations. Votre réponse n'est pas non plus correctement formatée.
user247702