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» (если вы пропустили используя директиву или ссылку на сборку?)

Пожалуйста, посмотрите и посоветуйте мне.

Джидиш Раджан
источник
14
Лучше всего добавить пакет Microsoft.AspNet.WebApi.Client .Nuget. Это оно!
Сачин Павар

Ответы:

435

Да, вам нужно добавить ссылку на

System.Net.Http.Formatting.dll

Это можно найти в области сборок расширений.

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

Джастин Харви
источник
7
Теперь я получаю сообщение об ошибке: «Не удалось загрузить файл или сборку» Newtonsoft.Json, версия = 4.5.0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed 'или одна из ее зависимостей. Система не может найти указанный файл. "
Джидиш Раджан
89
Обнаружено, что мне пришлось добавить пакет NuGet "Microsoft.AspNet.WebApi.Client", чтобы гарантировать, что версия dll форматирования работала с версией .NET Framework "System.Net.Http" в моем проекте.
Тодд Х.
27
Почему ссылки на стандартную системную сборку требуют от меня загрузки материалов с открытым исходным кодом из случайных мест в Интернете, чтобы заставить его функционировать? Почему это даже компилируется, если он не может разрешить свои зависимости? Это раздражает меня до бесконечности!
Нейтрино
4
@Neutrino Вы бы предпочли написать код самостоятельно? Вы должны быть благодарны, что люди в Microsoft и других местах написали код, который вы можете использовать бесплатно
reggaeguitar
4
PM> Install-Package System.Net.Http.Formatting.Extension
Яр
194

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.
Гекхан Курт
3
Абсолютно лучший ответ. Выбранный ответ не лучшая практика вообще , на самом деле Microsoft рекомендует не ссылочные библиотеки DLL
Astaar
4
Не по теме, но я все равно хочу упомянуть: используйте await FooAsync()вместо FooAsync().Result. Последний может зайти в тупик. См. Stackoverflow.com/q/17248680/2272514 и его принятый ответ. Есть также хорошие ссылки о деталях.
Томас Шрайтер
2
Чтобы использовать тип вместо «приложения / JSON» вы можете использовать MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/...
daviesdoesit
164

Недостающая ссылка - это 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 введитеInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian
4

Я знаю, что этот ответ слишком поздно, у меня была та же проблема, и я добавлял System.Net.Http.Formatting.ExtensionNuget, после проверки здесь и там я обнаружил, что Nuget добавлен, но System.Net.Http.Formatting.dllне был добавлен в ссылки, я просто переустановил Nuget

Абед Кафф
источник
3

Попробуйте установить в свой проект пакет NuGet: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client
Александр Спреафико Новаес
источник
2

Вместо написания такого количества кода для простого вызова вы можете использовать одну из оболочек, доступных через Интернет.

Я написал один под названием WebApiClient, доступный на NuGet ... проверить это!

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

Андрео Ромера
источник
@Andreo Ссылка ( webapiclient.azurewebsites.net ) теперь не работает, как 30 ноября 2017 года. Рабочая ссылка NuGet - nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G
К сожалению, Microsoft прекратила мою лазурную подписку, и URL больше не действителен :(
Андрео Ромера,
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);
Нажмите Ok
источник