HttpClient не поддерживает метод PostAsJsonAsync C#
Я пытаюсь вызвать веб-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;
и я получаю сообщение об ошибке:
Error: 'System.Net.Http.HttpClient' does not contain a definition for 'PostAsJsonAsync' and
no extension method 'PostAsJsonAsync' accepting a first argument of type
'System.Net.Http.HttpClient' could be found (are you missing a using directive or an
assembly reference?)
Пожалуйста, посмотрите и посоветуйте мне.
15 ответов
Да, вам нужно добавить ссылку на
System.Net.Http.Formatting.dll
Это можно найти в области сборок расширений.
Хороший способ добиться этого - добавить пакет NuGet. System.Net.Http.Formatting.Extension
к вашему проекту.
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;
См. https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836
Недостающее упоминание System.Net.Http.Formatting.dll
, Но лучшее решение - добавить пакет NuGet. Microsoft.AspNet.WebApi.Client
чтобы версия dll форматирования работала с версией.NET Framework System.Net.Http
в моем проекте.
Как уже обсуждалось, этот метод больше не доступен с.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)
,
У меня тоже была эта проблема в проекте, который я только что проверил из системы контроля версий.
Симптомом была ошибка, описанная выше, и желтый предупреждающий треугольник на System.Net.Http.Formatting
Чтобы это исправить, я удалил неработающую ссылку, а затем использовал NuGet для установки последней версии Microsoft.AspNet.WebApi.Client
,
Хорошо, сейчас апокалиптический 2020 год, и вы можете найти эти методы в пакете NuGet.
System.Net.Http.Json
. Но имейте в виду, что он использует
System.Text.Json
внутренне.
И если вам действительно нужно узнать, где находится API, просто используйте https://apisof.net/
Если вы уже используете Newtonsoft.Json, попробуйте следующее:
// 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"));
Производительность выше, чем у JavaScriptSerializer. Посмотрите здесь https://www.newtonsoft.com/json/help/html/Introduction.htm
Я знаю, что этот ответ слишком поздно, у меня была та же проблема, и я добавлял System.Net.Http.Formatting.Extension
Nuget, после проверки здесь и там я обнаружил, что Nuget добавляется, но System.Net.Http.Formatting.dll
не был добавлен в ссылки, я просто переустановил Nuget
Попробуйте установить в свой проект пакет NuGet: Microsoft.AspNet.WebApi.Client:
Install-Package Microsoft.AspNet.WebApi.Client
Вместо написания такого количества кода для простого вызова вы можете использовать одну из оболочек, доступных через Интернет.
Я написал один под названием WebApiClient, доступный на NuGet... проверить это!
https://www.nuget.org/packages/WebApiRestService.WebApiClient/
Если вы играете в Blazor и получаете сообщение об ошибке, вам необходимо добавить пакет Microsoft.AspNetCore.Blazor.HttpClient
.
Для меня я нашел решение после долгих попыток, которое заменяет
HttpClient
с
System.Net.Http.HttpClient
Основываясь на ответах здесь, говорящих об использовании Newtonsoft.Json, я создал для этого вспомогательный класс:
public class JsonContent : StringContent
{
public JsonContent(object model)
: base(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json")
{
}
}
Пример использования:
using (var content = new JsonContent(user))
{
var response = client.PostAsync("api/AgentCollection", content).Result;
}
Просто расширяя ответ Джеруна советами в комментариях:
var content = new StringContent(
JsonConvert.SerializeObject(user),
Encoding.UTF8,
MediaTypeNames.Application.Json);
var response = await client.PostAsync("api/AgentCollection", content);
Если вы используете компоненты Blazor и получаете эту ошибку, это означает, что ваш компонент не может найти http-клиент. используйте эту строку сверху вашего компонента blazor.
@inject HttpClient Http
Убедитесь, что эта строка есть в вашей программе или файле запуска.
builder.Services.AddScoped(sp =>
new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });