HttpClient не підтримує метод PostAsJsonAsync C #


255

Я намагаюся викликати веб-API зі свого веб-додатку. Я використовую .Net 4.5, і під час написання коду я отримую помилку HttpClient, не містить PostAsJsonAsyncметоду визначення .

Нижче наведено код:

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;

і я отримую повідомлення про помилку:

Помилка: 'System.Net.Http.HttpClient' не містить визначення для 'PostAsJsonAsync', і немає методу розширення 'PostAsJsonAsync', який приймає перший аргумент типу 'System.Net.Http.HttpClient' (не вистачає використовуючи директиву чи посилання на збірку?)

Будь ласка, погляньте та порадьте мене.


13
Найкращим варіантом є додавання пакета "Microsoft.AspNet.WebApi.Client" .Nuget. Це воно!
Sachin Pawar

Відповіді:


435

Так, вам потрібно додати посилання на

System.Net.Http.Formatting.dll

Це можна знайти в області збірок розширень.

Хороший спосіб досягти цього - додавши пакет NuGetMicrosoft.AspNet.WebApi.Client до свого проекту.


7
Тепер я отримую помилку: "Не вдалося завантажити файл або збірку" Newtonsoft.Json, Версія = 4.5.0.0, Культура = нейтральна, PublicKeyToken = 30ad4fe6b2a6aeed "або одна з її залежностей. Система не може знайти вказаний файл."
Jidheesh Раджан

89
Виявлено, що мені довелося додати пакет NuGet "Microsoft.AspNet.WebApi.Client", щоб забезпечити, щоб версія формату dll працювала з .NET рамковою версією "System.Net.Http" у моєму проекті.
Тодд Х.

27
Чому посилання на стандартну системну збірку вимагає, щоб я завантажував речі з відкритим вихідним кодом з випадкових місць в Інтернеті, щоб змусити її працювати? Чому це навіть компілюється, якщо він не може вирішити свої залежності? Це дратує мене до кінця!
Нейтрино

4
@Neutrino Ви б краще написали код самостійно? Ви повинні бути вдячні, що люди в Microsoft та інших місцях написали код, який ви можете безкоштовно використовувати
reggaeguitar

4
PM> Install-Package System.Net.Http.Formatting.Extension
Яр

193

PostAsJsonAsyncбільше не в System.Net.Http.dll(.NET 4.5.2). Ви можете додати посилання наSystem.Net.Http.Formatting.dll , але це фактично належить до більш старої версії. У мене виникли проблеми з цим на нашому сервері збірки TeamCity, ці два не співпрацюють разом.

Як альтернативи, ви можете замінити PostAsJsonAsyncз PostAsyncвикликом, який є лише частиною нової бібліотеки DLL. Замініть

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

З:

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

Зверніть увагу , що JavaScriptSerializerзнаходиться в просторі імен: System.Web.Script.Serialization.

Вам потрібно буде додати посилання на збірку у свій csproj: System.Web.Extensions.dll

Дивіться https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836


7
Це має бути відповіддю. Найкращий спосіб зробити щось - це правильно
Аліреза

4
Це найкраща відповідь поки що. Не намагайтеся додавати NuGet пакети або dll.
Gökhan Kurt

3
Цілком найкраща відповідь. Обраний відповідь не найкраща практика взагалі , насправді Microsoft рекомендує не посилальні бібліотеки DLL
Astaar

4
Поза темою, але я все одно хочу згадати: Використовувати await FooAsync()замість FooAsync().Result. Останній може зайти в глухий кут. Дивіться stackoverflow.com/q/17248680/2272514 та його прийняту відповідь. Також є хороші посилання про деталі.
Томас Шрайтер

2
Для використання типу замість "application / json" ви можете використовувати MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit

163

Відсутня посилання - це System.Net.Http.Formatting.dll. Але краще рішення - додати пакет NuGet, Microsoft.AspNet.WebApi.Clientщоб забезпечити версію формату dll, що працювала з версією .NET Framework System.Net.Httpв моєму проекті.


1
@Yuval - тепер я розумію, що запропоноване мною рішення було звучати як коментар. Виявляється, Андрео був автором пакету NuGet, який я запропонував.
Тодд Х.

Це була відповідь для мене! (на моє запитання)
JenonD

34

Як уже обговорювалося, цей метод більше не доступний, оскільки .NET 4.5.2. Щоб розширити відповідь Jeroen K, ви можете зробити метод розширення:

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

Тепер ви можете зателефонувати client.PostAsJsonAsync("api/AgentCollection", user).


12

У мене ця проблема була і в проекті, який я щойно перевірив з контролю джерел.

Симптомом була помилка, описана вище, і жовтий попереджувальний трикутник на посилання на System.Net.Http.Formatting

Щоб виправити це, я видалив зламану посилання, а потім застосував NuGet для встановлення останньої версії Microsoft.AspNet.WebApi.Client.


2
Це працює! Щоб встановити Nuget Console, введітьInstall-Package Microsoft.AspNet.WebApi.Client
ю ян Цзянь

4

Я знаю, що ця відповідь занадто пізно, у мене був той самий випуск, і я додавав System.Net.Http.Formatting.ExtensionNuget, після перевірки тут і там я виявив, що Nuget додається, але System.Net.Http.Formatting.dllне було додано до посилань, я просто перевстановив Nuget



2

Замість того, щоб писати цю кількість коду, щоб здійснити простий дзвінок, ви можете скористатися однією з обгорткових машин, доступних через Інтернет.

Я написав один під назвою WebApiClient, доступний у NuGet ... перевірити!

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


@Andreo Посилання ( webapiclient.azurewebsites.net ) тепер перервано, як 30 листопада 2017 року. Робочим посиланням NuGet
Vishwajit G

На жаль, Microsoft закінчила мою підписку на блакитну
форму,

2

Якщо ви граєте в Blazor і отримуєте помилку, вам потрібно додати пакет Microsoft.AspNetCore.Blazor.HttpClient.


0

Просто розширюємо відповідь Йероана порадами в коментарях:

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

var response = await client.PostAsync("api/AgentCollection", content);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.