HttpClient nie obsługuje metody PostAsJsonAsync C #

255

Próbuję wywołać interfejs API sieci Web z mojej aplikacji internetowej. Używam .Net 4.5 i podczas pisania kodu otrzymuję błąd, HttpClientktóry nie zawiera PostAsJsonAsyncmetody definicji .

Poniżej znajduje się kod:

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;

i pojawia się komunikat o błędzie:

Błąd: „System.Net.Http.HttpClient” nie zawiera definicji „PostAsJsonAsync” i nie znaleziono metody rozszerzenia „PostAsJsonAsync” przyjmującej pierwszy argument typu „System.Net.Http.HttpClient” (czy brakuje Ci za pomocą dyrektywy lub odniesienia do zestawu?)

Proszę spojrzeć i doradzić mi.

Jidheesh Rajan
źródło
13
Najlepszą opcją jest dodanie pakietu „Microsoft.AspNet.WebApi.Client” .Nuget. Otóż ​​to!
Sachin Pawar

Odpowiedzi:

435

Tak, musisz dodać odniesienie do

System.Net.Http.Formatting.dll

Można to znaleźć w obszarze zespołów rozszerzeń.

Dobrym sposobem na osiągnięcie tego jest dodanie pakietu NuGetMicrosoft.AspNet.WebApi.Client do projektu.

Justin Harvey
źródło
7
Teraz pojawia się błąd: „Nie można załadować pliku lub zestawu„ Newtonsoft.Json, wersja = 4.5.0.0, Kultura = neutralny, PublicKeyToken = 30ad4fe6b2a6aeed ”lub jednej z jego zależności. System nie może znaleźć określonego pliku.”
Jidheesh Rajan
89
Stwierdziłem, że muszę dodać pakiet NuGet „Microsoft.AspNet.WebApi.Client”, aby upewnić się, że wersja dll formatowania działa z wersją „System.Net.Http” .NET Framework w moim projekcie.
Todd H.
27
Dlaczego odwoływanie się do standardowego zestawu systemu wymaga ode mnie pobierania materiałów open source z przypadkowych lokalizacji w Internecie, aby mógł on działać? Dlaczego to się nawet kompiluje, jeśli nie może rozwiązać swoich zależności? To mnie denerwuje bez końca!
Neutrino
4
@Neutrino Wolałbyś sam napisać kod? Powinieneś być wdzięczny, że ludzie w Microsoft i gdzie indziej napisali kod, którego możesz używać za darmo
reggaeguitar
4
PM> Zainstaluj pakiet System.Net.Http.Formatting.Extension
Yar
193

PostAsJsonAsyncnie jest już w System.Net.Http.dll(.NET 4.5.2). Możesz dodać odniesienie System.Net.Http.Formatting.dll, ale tak naprawdę należy ono do starszej wersji. Miałem z tym problemy na naszym serwerze kompilacji TeamCity, te dwa nie współpracowałyby ze sobą.

Alternatywnie, można zastąpić PostAsJsonAsyncz PostAsyncrozmowy, która jest tylko częścią nowego DLL. Zastąpić

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

Z:

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

Zauważ, że JavaScriptSerializerjest w przestrzeni nazw: System.Web.Script.Serialization.

Będziesz musiał dodać odwołanie do zestawu w swoim csproj: System.Web.Extensions.dll

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

Jeroen K.
źródło
7
To powinna być odpowiedź. Najlepszym sposobem na zrobienie czegoś jest właściwy sposób
Alireza
4
To najlepsza jak dotąd odpowiedź. Nie próbuj dodawać pakietów lub bibliotek DLL NuGet.
Gökhan Kurt
3
Zupełnie najlepsza odpowiedź. Wybrana odpowiedź nie jest najlepszą praktyką w ogóle , w rzeczywistości Microsoft nie zaleca DLL odniesienia
Astaar
4
Nie na temat, ale i tak chcę o tym wspomnieć: użyj await FooAsync()zamiast FooAsync().Result. Ten ostatni może zostać zakleszczony. Zobacz stackoverflow.com/q/17248680/2272514 i jego zaakceptowaną odpowiedź. Istnieją również dobre linki o szczegółach.
Thomas Schreiter
2
Aby użyć typu zamiast „application / json”, możesz użyć MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit
163

Brakującym odniesieniem jest System.Net.Http.Formatting.dll. Ale lepszym rozwiązaniem jest dodanie pakietu NuGet, Microsoft.AspNet.WebApi.Clientaby upewnić się, że wersja dll formatowania działa z wersją środowiska .NET System.Net.Httpw moim projekcie.

Todd H.
źródło
1
@Yuval - Zdaję sobie teraz sprawę, że zaproponowane przeze mnie „rozwiązanie” brzmiało jak komentarz. Okazuje się, że Andreo jest autorem pakietu NuGet, który zasugerowałem.
Todd H.,
To była dla mnie odpowiedź! (na moje pytanie)
JenonD
34

Jak już zostało omówione, ta metoda nie jest już dostępna od .NET 4.5.2. Aby rozwinąć odpowiedź Jeroen K , możesz wykonać metodę rozszerzenia:

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);
}

Teraz możesz dzwonić client.PostAsJsonAsync("api/AgentCollection", user).

Christian Gollhardt
źródło
12

Miałem też ten problem z projektem, który właśnie sprawdziłem z kontroli źródła.

Objawem był opisany powyżej błąd i żółty trójkąt ostrzegawczy w odniesieniu do System.Net.Http.Formatting

Aby to naprawić, usunąłem uszkodzone odniesienie, a następnie użyłem NuGet do zainstalowania najnowszej wersji Microsoft.AspNet.WebApi.Client.

Pan Giggles
źródło
2
To działa! Aby zainstalować przez Nuget Console, wpiszInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian
4

Wiem, że ta odpowiedź jest za późno, miałem ten sam problem i System.Net.Http.Formatting.Extensiondodawałem Nuget, po sprawdzeniu tutaj i tam znalazłem, że Nuget został dodany, ale System.Net.Http.Formatting.dllnie został dodany do referencji, właśnie ponownie zainstalowałem Nuget

Abed Kaff
źródło
3

Spróbuj zainstalować w swoim projekcie pakiet NuGet: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client
Alexandre Spreafico Novaes
źródło
2

Zamiast pisać taką ilość kodu, aby wykonać proste połączenie, możesz użyć jednego z opakowań dostępnych w Internecie.

Napisałem jeden o nazwie WebApiClient, dostępny w NuGet ... sprawdź!

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

Andreo Romera
źródło
@Andreo Link ( webapiclient.azurewebsites.net ) jest teraz zepsuty jak na 30 listopada 2017 r. Działającym linkiem NuGet
Vishwajit G
Niestety Microsoft zakończył moją subskrypcję lazurową, a adres URL jest już nieważny :(
Andreo Romera
2

Jeśli bawisz się w Blazorze i widzisz błąd, musisz dodać pakiet Microsoft.AspNetCore.Blazor.HttpClient.

Briseis
źródło
0

Po prostu rozszerzam odpowiedź Jeroena o wskazówki w komentarzach:

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

var response = await client.PostAsync("api/AgentCollection", content);
Kliknij OK
źródło