122 votes

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

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. Il 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.

157voto

Water Cooler v2 Points 3110

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

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

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

Reflector est venu à la rescousse !

118voto

Darin Dimitrov Points 528142

Assurez-vous que vous avez installé le correct NuGet package dans 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 GetAllFoos est définie pour retourner un IEnumerable<Prospect> alors que dans votre ReadAsAsync vous passez la méthode IEnumerable<Foo> qui ne sont évidemment pas des types compatibles.

Install-Package Microsoft.AspNet.WebApi.Client

Select project in project manager console

34voto

  • si vous ne pouvez pas trouver la référence de l'assemblage à partir de quand (clic droit sur la référence -> ajouter l'assemblage requis).

essayez ceci Console du gestionnaire de paquets
Installer-Package System.Net.Http.Formatting.Extension -Version 5.2.3 et ensuite ajouter en utilisant add reference .

15voto

Conor Kelly Points 251

L'ajout d'une référence à System.Net.Http.Formatting.dll peut entraîner des problèmes de non-concordance des DLL. Actuellement, 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 .NET Assembly si vous faites référence au dernier paquet NuGet ou à la dernière DLL de Newtonsoft :

<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 la forme d'une chaîne de caractères, puis à la désérialiser avec JsonConvert.DeserializeObject(responseAsString). La méthode complète serait la suivante :

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;
      }
}

9voto

Ram Points 31

Ou si vous avez VS 2012, vous pouvez aller dans la console du gestionnaire de paquets et taper Installer-Package Microsoft.AspNet.WebApi.Client

Cela permet de télécharger la dernière version du paquet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X