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

Другие вопросы по тегам