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