HttpClient nie obsługuje metody PostAsJsonAsync C#

Próbuję wywołać web API z mojej aplikacji internetowej. Używam. Net 4.5 i podczas pisania kodu dostaję błąd HttpClient nie zawiera definicji PostAsJsonAsync metoda.

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 otrzymuję komunikat o błędzie:

Błąd: 'System. Net. Http. HttpClient' nie zawiera definicji dla 'PostAsJsonAsync' i brak metody rozszerzenia 'PostAsJsonAsync' przyjmującej pierwszy argument Typ 'System.Net.Http.HttpClient' można znaleźć (brakuje dyrektywa czy odniesienie do zespołu?)

Proszę spojrzeć i doradzić mi.
Author: Ferdipux, 2013-10-03

13 answers

Tak, musisz dodać odniesienie do

System.Net.Http.Formatting.dll

Można to znaleźć w obszarze extensions assemblies.

Dobrym sposobem osiągnięcia tego jest dodanie pakietu NuGet Microsoft.AspNet.WebApi.Client do twojego projektu.

 476
Author: Justin Harvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-01 21:02:57

PostAsJsonAsync nie jest już w System.Net.Http.dll (. NET 4.5.2). Możesz dodać odniesienie do System.Net.Http.Formatting.dll, ale w rzeczywistości należy ono do starszej wersji. Napotkałem na problemy z tym na naszym serwerze TeamCity build, te dwie nie chciały ze sobą współpracować.

Alternatywnie można zastąpić PostAsJsonAsync wywołaniem PostAsync, które jest tylko częścią nowej biblioteki dll. Replace

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 JavaScriptSerializer znajduje się w przestrzeni nazw: System.Web.Script.Serialization.

Będziesz musiał dodać odniesienie do montażu w swoim csproj: System.Web.Extensions.dll

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

 206
Author: Jeroen K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-09 07:19:28

Brakujące odniesienie to System.Net.Http.Formatting.dll. Ale lepszym rozwiązaniem jest dodanie pakietu NuGet Microsoft.AspNet.WebApi.Client, aby upewnić się, że wersja biblioteki formatującej działała z wersją System.Net.Http. NET framework w moim projekcie.

 166
Author: Todd H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 17:17:28

Jak już wspomniano, ta metoda nie jest już dostępna od. NET 4.5.2. Aby rozwinąć na odpowiedź Jeroena 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 zadzwonić client.PostAsJsonAsync("api/AgentCollection", user).

 37
Author: Christian Gollhardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

Też miałem ten problem w projekcie, 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 na odniesienia do System.Net.Http.Formatting

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

 13
Author: Mr Giggles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 09:29:54

Wiem, że ta odpowiedź jest za późno, miałem ten sam problem i dodałem System.Net.Http.Formatting.Extension Nuget, po sprawdzeniu tu i tam znalazłem, że Nuget jest dodawany, ale System.Net.Http.Formatting.dll nie został dodany do referencji, po prostu ponownie zainstalowałem Nuget

 4
Author: Abed Kaff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 09:56:03

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

Install-Package Microsoft.AspNet.WebApi.Client
 4
Author: Alexandre Spreafico Novaes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-31 18:48:47

Ok, jest apokaliptyczny 2020 teraz, i można znaleźć te metody w pakiecie NuGet System.Net.Http.Json. Ale uważaj, że używa System.Text.Json wewnętrznie.

A jeśli naprawdę chcesz dowiedzieć się, które API znajduje się gdzie, po prostu użyj https://apisof.net/

 3
Author: Pavel Voronin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-21 19:17:16

Zamiast pisać taką ilość kodu, aby wykonać proste połączenie, możesz użyć jednego z wrapperów dostępnych przez internet.

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

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

 2
Author: Andreo Romera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-28 09:24:17

Jeśli grasz w Blazor i dostajesz błąd, musisz dodać pakiet Microsoft.AspNetCore.Blazor.HttpClient.

 2
Author: Briseis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-03 13:26:16

Just expanding Jeroen ' s answer with the tips in comments:

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

var response = await client.PostAsync("api/AgentCollection", content);
 0
Author: Click Ok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-27 23:54:23

Dla mnie znalazłem rozwiązanie po wielu próbach, które zastępuje

HttpClient

Z

System.Net.Http.HttpClient
 0
Author: Waleed ELerksosy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-05 19:22:42

Jeśli używasz już Newtonsoft.JSON spróbuj tego:

  // Alternative using WebApi.Client 5.2.7
  ////var response = await Client.PutAsJsonAsync(
  ////    "api/AgentCollection", user
  ////    requestListDto)

  var response = await Client.PostAsync("api/AgentCollection", new StringContent(
    JsonConvert.SerializeObject(user), Encoding.UTF8, "application/json"));

Wydajność jest lepsza niż JavaScriptSerializer. Spójrz tutaj https://www.newtonsoft.com/json/help/html/Introduction.htm

 0
Author: Andrea86,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-12 11:14:35