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.