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

97

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 von einem MVC-Client verwendet.

Wasserkühler v2
quelle

Antworten:

139

Nach einem langen Kampf fand ich die Lösung.

Lösung: Fügen Sie einen Verweis auf hinzu System.Net.Http.Formatting.dll. Diese Assembly ist auch im Ordner C: \ Programme \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies verfügbar .

Die Methode ReadAsAsyncist eine Erweiterungsmethode, die in der Klasse deklariert ist HttpContentExtensions, die sich im Namespace System.Net.Httpder Bibliothek befindet System.Net.Http.Formatting.

Reflektor kam zur Rettung!

Wasserkühler v2
quelle
7
Selbstantworten, die anderen helfen, die Vororte zu rocken!
GranadaCoder
Wie haben Sie diesen Ordner dort bekommen? Ich habe das Webplattform-Installationsprogramm verwendet und es hat diesen Ordner nicht in den Programmdateien erstellt.
Bladefist
5
Referenz hinzufügen -> Baugruppen -> Erweiterungen. Wenn es nicht aufgeführt ist, gehen Sie zum Feld Search Assemblies und geben Sie 'formatating' ein. Hoffentlich fällt es Ihnen dadurch leichter.
FrankO
1
Ein Update habe ich hier gefunden: C: \ Programme (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Pakete \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph
6
nuget.org/packages/System.Net.Http.Formatting.Extension - Grund, dies nicht zu verwenden?
WernerCD
93

Stellen Sie sicher, dass Sie Folgendes correct NuGet packagein Ihrer Konsolenanwendung installiert haben :

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

und dass Sie mindestens .NET 4.0 als Ziel haben.

Abgesehen davon ist Ihre GetAllFoosFunktion so definiert, dass sie eine IEnumerable<Prospect>zurückgibt, während Sie in Ihrer ReadAsAsyncMethode übergeben, IEnumerable<Foo>die offensichtlich keine kompatiblen Typen sind.

Install-Package Microsoft.AspNet.WebApi.Client

Wählen Sie das Projekt in der Projektmanagerkonsole aus

Darin Dimitrov
quelle
Vielen Dank. Das war ein Ausrutscher, ein Überbleibsel meiner Bemühungen, geschäftsbezogenen Code zu entfernen und durch Foos zu ersetzen.
Wasserkühler v2
Ich verstehe nicht. Ich ziele bereits in meinen Konsolen-App-Eigenschaften auf das .NET 4.0-Framework ab. Muss ich einen Verweis auf diese Bibliothek Microsoft.AspNet.WebAPI.Client.dll festlegen? Ich habe im ASP.NET MVC-Projekt niemals einen solchen Verweis festgelegt, der auch meine Web-API verwendet und einwandfrei funktioniert.
Wasserkühler v2
5
Sie müssen das Microsoft.AspNet.WebApi.ClientNuGet installieren . Dadurch wird die neueste Version aus dem Internet heruntergeladen und auf die Assembly in Ihrer Konsolenanwendung verwiesen. Genau das macht die ASP.NET MVC-Projektvorlage und ist der Grund, warum Sie nichts installieren müssen, damit es funktioniert. Aber in Ihrer Konsolenanwendung gibt es so etwas nicht.
Darin Dimitrov
1
Vielen Dank. Ich habe getan, was du gesagt hast. Ich habe 12 Projekte in meiner Lösung, aber aus irgendeinem seltsamen Grund, nachdem ich in der Library Package Manager-Konsole "Installationspaket Microsoft.AspNet.WebApi.Client" gesagt hatte, druckte es seine übliche Ablaufverfolgung und sagte dann "Microsoft.AspNet erfolgreich installiert" .WebApi.Client in MyMVCProjectNameAndNotMyConsoleProjectName '. Das nächste Mal habe ich mein Konsolenprojekt ausgewählt und dasselbe in die Paketmanager-Konsole eingegeben. MyMVCProjectName verweist bereits auf Microsoft.AspNet.WebApi.Client. Ich bin verwirrt.
Wasserkühler v2
Ja ich auch. Von vorne beginnen. Neue Konsolenanwendung, öffnen Sie die NuGet-Konsole, geben Sie Install-Package Microsoft.AspNet.WebApi.Clientden Code ein und probieren Sie ihn aus.
Darin Dimitrov
20
  • Wenn Sie die Baugruppenreferenz ab wann nicht finden können (Rechtsklick auf Referenz -> Erforderliche Baugruppe hinzufügen)

Versuche dies Manager - Paket console
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 und fügen Sie dann durch Add Referenz.

Ganganath Rathnasekara
quelle
2
Ich habe die Dotnetcore-Anwendung von 2.2 auf 3.1 migriert und bin auf diesen Fehler gestoßen. Meine App hat bereits einen Verweis auf System.Net.Http.Formatting.Extension v5.2.3, aber meine App hat diesen Fehler beanstandet, sodass ich das Nuget-Paket Microsoft.AspNet.WebApi installiert habe .Client wie von Rikin und Darin vorgeschlagen und danach behoben. Danke
AKS
12

Das Hinzufügen eines Verweises auf System.Net.Http.Formatting.dll kann zu Problemen mit der DLL-Nichtübereinstimmung führen. Derzeit scheint System.Net.Http.Formatting.dll auf Version 4.5.0.0 von Newtonsoft.Json.DLL zu verweisen, 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;
      }
}
Conor Kelly
quelle
9

Wenn Sie über VS 2012 verfügen, können Sie die Paketmanagerkonsole aufrufen und Install-Package Microsoft.AspNet.WebApi.Client eingeben

Dies würde die neueste Version des Pakets herunterladen

RAM
quelle
Das hat es für mich behoben. - mit VS2013
Dan Rayson
Wenn Sie bereits ein Microsoft.AspNet.WebApi.Client-Paket haben, versuchen Sie, es zu deinstallieren und zu installieren. Dadurch wurde mein Problem für Version 5.2.3
Naveen
-1

Verwenden Sie diese Assembly-Referenz in Ihrem Projekt

Add a reference to System.Net.Http.Formatting.dll
Debendra Dash
quelle
6
Die akzeptierte Antwort vom Januar 2013 erklärt dies bereits und enthält weitere Informationen. Ihre Antwort ist auch nicht richtig formatiert.
user247702