HttpClient unterstützt die PostAsJsonAsync-Methode C # nicht

255

Ich versuche, eine Web-API aus meiner Webanwendung aufzurufen. Ich verwende .Net 4.5 und beim Schreiben des Codes erhalte ich den Fehler, HttpClientder keine Definitionsmethode enthält PostAsJsonAsync.

Unten ist der Code:

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:51093/");
client.DefaultRequestHeaders.Accept.Add(
   new MediaTypeWithQualityHeaderValue("application/json"));
var user = new Users();
user.AgentCode = 100;
user.Remarks = "Test";
user.CollectionDate = System.DateTime.Today;
user.RemittanceDate = System.DateTime.Today;
user.TotalAmount = 1000;
user.OrgBranchID = 101;

var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;

und ich erhalte die Fehlermeldung:

Fehler: 'System.Net.Http.HttpClient' enthält keine Definition für 'PostAsJsonAsync' und es konnte keine Erweiterungsmethode 'PostAsJsonAsync' gefunden werden, die ein erstes Argument vom Typ 'System.Net.Http.HttpClient' akzeptiert (fehlt Ihnen ein mit Direktive oder Assembly-Referenz?)

Bitte schauen Sie und beraten Sie mich.

Jidheesh Rajan
quelle
13
Am besten fügen Sie das .Nuget-Paket 'Microsoft.AspNet.WebApi.Client' hinzu. Das ist es!
Sachin Pawar

Antworten:

435

Ja, Sie müssen einen Verweis auf hinzufügen

System.Net.Http.Formatting.dll

Dies finden Sie im Bereich Erweiterungsbaugruppen.

Ein guter Weg, dies zu erreichen, ist das Hinzufügen des NuGet-PaketsMicrosoft.AspNet.WebApi.Client zu Ihrem Projekt.

Justin Harvey
quelle
7
Jetzt wird eine Fehlermeldung angezeigt: "Datei oder Assembly 'Newtonsoft.Json, Version = 4.5.0.0, Kultur = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Das System kann die angegebene Datei nicht finden."
Jidheesh Rajan
89
Ich musste das NuGet-Paket "Microsoft.AspNet.WebApi.Client" hinzufügen, um sicherzustellen, dass die Version der Formatierungs-DLL mit der .NET Framework-Version von "System.Net.Http" in meinem Projekt funktioniert.
Todd H.
27
Warum muss ich für das Verweisen auf eine Standardsystembaugruppe Open Source-Inhalte von zufälligen Stellen im Internet herunterladen, damit sie funktionieren? Warum wird dies überhaupt kompiliert, wenn es seine Abhängigkeiten nicht auflösen kann? Das ärgert mich bis zum Ende!
Neutrino
4
@Neutrino Möchten Sie den Code lieber selbst schreiben? Sie sollten dankbar sein, dass die Leute bei Microsoft und anderswo Code geschrieben haben, den Sie kostenlos verwenden können
reggaeguitar
4
PM> Install-Package System.Net.Http.Formatting.Extension
Yar
193

PostAsJsonAsyncist nicht mehr in der System.Net.Http.dll.NET 4.5.2. Sie können einen Verweis auf hinzufügen System.Net.Http.Formatting.dll, dieser gehört jedoch tatsächlich zu einer älteren Version. Ich hatte auf unserem TeamCity-Build-Server Probleme damit, diese beiden würden nicht zusammenarbeiten.

Alternativ können Sie durch PostAsJsonAsynceinen PostAsyncAufruf ersetzen , der nur ein Teil der neuen DLL ist. Ersetzen

var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;

Mit:

var response = client.PostAsync("api/AgentCollection", new StringContent(
   new JavaScriptSerializer().Serialize(user), Encoding.UTF8, "application/json")).Result;

Beachten Sie, dass JavaScriptSerializersich im Namespace befindet : System.Web.Script.Serialization.

Sie müssen eine Assembly-Referenz in Ihr csproj einfügen: System.Web.Extensions.dll

Siehe https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836

Jeroen K.
quelle
7
Dies sollte die Antwort sein. Der beste Weg, etwas zu tun, ist der richtige Weg
Alireza
4
Dies ist die bisher beste Antwort. Versuchen Sie nicht, NuGet-Pakete oder DLLs hinzuzufügen.
Gökhan Kurt
3
Total die beste Antwort. Ausgewählte Antwort ist nicht eine bewährte Methode überhaupt , in der Tat empfiehlt Microsoft nicht zu Referenz DLLs
Astaar
4
Off Topic, aber ich möchte es trotzdem erwähnen: Verwenden Sie await FooAsync()statt FooAsync().Result. Letzteres kann zum Stillstand kommen. Siehe stackoverflow.com/q/17248680/2272514 und die akzeptierte Antwort. Es gibt auch gute Links zu Details.
Thomas Schreiter
2
Um einen Typ anstelle von "application / json" zu verwenden, können Sie MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit
163

Die fehlende Referenz ist die System.Net.Http.Formatting.dll. Die bessere Lösung besteht jedoch darin, das NuGet-Paket hinzuzufügen, Microsoft.AspNet.WebApi.Clientum sicherzustellen, dass die Version der Formatierungs-DLL mit der .NET Framework-Version von System.Net.Httpin meinem Projekt funktioniert .

Todd H.
quelle
1
@ Yuval - Mir ist jetzt klar, dass die von mir vorgeschlagene "Lösung" wie ein Kommentar klang. Es stellt sich heraus, dass Andreo das von mir vorgeschlagene NuGet-Paket verfasst hat.
Todd H.
Das war die Antwort auf mich! (zu meiner Frage)
JenonD
34

Wie bereits diskutiert, ist diese Methode seit .NET 4.5.2 nicht mehr verfügbar. Um die Antwort von Jeroen K zu erweitern , können Sie eine Erweiterungsmethode erstellen:

public static async Task<HttpResponseMessage> PostAsJsonAsync<TModel>(this HttpClient client, string requestUrl, TModel model)
{
    var serializer = new JavaScriptSerializer();
    var json = serializer.Serialize(model);
    var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
    return await client.PostAsync(requestUrl, stringContent);
}

Jetzt können Sie anrufen client.PostAsJsonAsync("api/AgentCollection", user).

Christian Gollhardt
quelle
12

Ich hatte dieses Problem auch bei einem Projekt, das ich gerade aus der Quellcodeverwaltung ausgecheckt hatte.

Das Symptom war der oben beschriebene Fehler und ein gelbes Warndreieck auf einem Verweis auf System.Net.Http.Formatting

Um dies zu beheben, habe ich die fehlerhafte Referenz entfernt und dann mit NuGet die neueste Version von installiert Microsoft.AspNet.WebApi.Client.

Herr Giggles
quelle
2
Es klappt! Um von Nuget Console zu installieren, geben SieInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian
4

Ich weiß, dass diese Antwort zu spät ist, ich hatte das gleiche Problem und System.Net.Http.Formatting.Extensionich habe das Nuget hinzugefügt. Nachdem ich hier und da überprüft hatte, dass das Nuget hinzugefügt wurde, das System.Net.Http.Formatting.dllaber nicht zu den Referenzen hinzugefügt wurde, habe ich das Nuget einfach neu installiert

Abed Kaff
quelle
3

Versuchen Sie, das NuGet-Paket in Ihrem Projekt zu installieren: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client
Alexandre Spreafico Novaes
quelle
2

Anstatt diese Menge an Code zu schreiben, um einen einfachen Anruf zu tätigen, können Sie einen der über das Internet verfügbaren Wrapper verwenden.

Ich habe einen mit dem Namen WebApiClient geschrieben, der bei NuGet erhältlich ist ... probieren Sie es aus!

https://www.nuget.org/packages/WebApiRestService.WebApiClient/

Andreo Romera
quelle
@Andreo Der Link ( webapiclient.azurewebsites.net ) ist jetzt wie am 30.11.2017 unterbrochen. NuGet Arbeitslink ist nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G
Leider hat Microsoft mein Azure-Abonnement beendet und die URL ist nicht mehr gültig :(
Andreo Romera
2

Wenn Sie in Blazor herumspielen und den Fehler erhalten, müssen Sie das Paket hinzufügen Microsoft.AspNetCore.Blazor.HttpClient.

Briseis
quelle
0

Erweitern Sie einfach Jeroens Antwort mit den Tipps in den Kommentaren:

var content = new StringContent(
    JsonConvert.SerializeObject(user), 
    Encoding.UTF8, 
    MediaTypeNames.Application.Json);

var response = await client.PostAsync("api/AgentCollection", content);
OK klicken
quelle