Ich habe eine Konsolen-App erstellt, um eine soeben erstellte Web-API zu verwenden. Der Konsolen-App-Code wird nicht kompiliert. Es gibt mir den Kompilierungsfehler:
'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?)
Hier ist eine Testmethode, bei der dieser Fehler auftritt.
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;
}
Ich habe diese Methode verwendet und sie von einem MVC-Client aus verwendet.
Nach einem langen Kampf fand ich die Lösung.
Lösung: Verweis auf System.Net.Http.Formatting.dll
Hinzufügen. Diese Assembly ist auch im Ordner C:\Programme\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies verfügbar.
Die Methode ReadAsAsync
ist eine in der Klasse HttpContentExtensions
deklarierte Erweiterungsmethode, die sich im Namespace System.Net.Http
In der Bibliothek System.Net.Http.Formatting
Befindet.
Reflektor kam zu retten!
Stellen Sie sicher, dass Sie correct NuGet package
in Ihrer Konsolenanwendung installiert haben:
<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />
und dass Sie mindestens auf .NET 4.0 abzielen.
Abgesehen davon gibt Ihre GetAllFoos
-Funktion einen IEnumerable<Prospect>
Zurück, während Sie in Ihrer ReadAsAsync
-Methode IEnumerable<Foo>
Übergeben, die offensichtlich nicht kompatible Typen sind.
Install-Package Microsoft.AspNet.WebApi.Client
versuchen Sie dies Package Manager-Konsole
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 und dann mit add reference hinzufügen.
Das Hinzufügen eines Verweises auf System.Net.Http.Formatting.dll kann DLL nicht übereinstimmende Probleme verursachen. Derzeit scheint System.Net.Http.Formatting.dll auf Version 4.5.0.0 von Newtonsoft zu verweisen. Json.DLL, während die neueste Version 6.0.0.0 ist. Das bedeutet, dass Sie auch eine Bindungsumleitung hinzufügen müssen, um eine .NET Assembly-Ausnahme zu vermeiden, wenn Sie auf das neueste Newtonsoft NuGet-Paket oder die neueste DLL verweisen:
<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>
Eine alternative Lösung zum Hinzufügen eines Verweises auf System.Net.Http.Formatting.dll besteht darin, die Antwort als Zeichenfolge zu lesen und sich dann mit JsonConvert.DeserializeObject (responseAsString) zu desearalisieren. Die vollständige Methode wäre:
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;
}
}
wenn Sie VS 2012 haben, können Sie zur Paketmanagerkonsole gehen und Install-Package Microsoft.AspNet.WebApi.Client eingeben
Dies würde die neueste Version des Pakets herunterladen