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.


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.


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


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.


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).


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.


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



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 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.


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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.