it-swarm.com.de

'System.Net.Http.HttpContent' enthält keine Definition für 'ReadAsAsync' und keine Erweiterungsmethode

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.

83
Water Cooler v2

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!

119
Water Cooler v2

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

Select project in project manager console

82
Darin Dimitrov
  • wenn Sie die Assembly-Referenz von wann nicht finden können (Klicken Sie mit der rechten Maustaste auf die Referenz -> fügen Sie die erforderliche Assembly hinzu)

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;
      }
}
10
Conor Kelly

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

8
Ram