web-dev-qa-db-fra.com

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

J'ai créé une application console pour utiliser une API Web que je venais de créer. Le code de l'application de la 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.

83
Water Cooler v2

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 dossier C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies.

La méthode ReadAsAsync est une méthode d’extension déclarée dans la classe HttpContentExtensions, qui est dans l’espace de nommage System.Net.Http dans la bibliothèque System.Net.Http.Formatting.

Le réflecteur est venu à la rescousse!

119
Water Cooler v2

Assurez-vous d’avoir installé le correct NuGet package dans votre application console:

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

et que vous visez au moins .NET 4.0.

Ceci étant dit, votre fonction GetAllFoos est définie pour renvoyer un IEnumerable<Prospect> alors que dans votre méthode ReadAsAsync vous passez IEnumerable<Foo> qui, de toute évidence, ne sont pas compatibles.

Install-Package Microsoft.AspNet.WebApi.Client

Select project in project manager console

82
Darin Dimitrov
  • si vous ne parvenez pas à trouver la référence d'assemblage à partir de quand (cliquez avec le bouton droit de la souris sur la référence -> ajouter l'assemblage requis)

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

11

L'ajout d'une référence à System.Net.Http.Formatting.dll peut provoquer DLL des problèmes d'incompatibilité. À 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, ce qui signifie que vous devez également ajouter une redirection de liaison pour éviter une exception .NET Assembly 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> 

Par conséquent, une solution alternative pour ajouter une référence à System.Net.Http.Formatting.dll consiste à lire la réponse sous forme de chaîne, puis à se dés-araligner 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;
      }
}
10
Conor Kelly

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

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

8
Ram