Где находится метод PostAsJsonAsync в ASP.NET Core?

Я искал метод расширения PostAsJsonAsync() в ASP.NET Core. На основании этой статьи он доступен в Microsoft.AspNet.WebApi.Client сборке.

Однако я думал, что Microsoft изменила все имена сборок с Microsoft.AspNet на Microsoft.AspNetCore, чтобы быть более конкретными для .NET Core, и все же я не могу найти сборку Microsoft.AspNetCore.WebApi.Client.

Где находится метод расширения PostAsJsonAsync() в ASP.NET Core?


person LP13    schedule 13.10.2016    source источник
comment
Он не является частью проекта ASP.NET Core и, следовательно, не соответствует схеме именования Microsoft.AspNetCore.*. Изначально это расширение для приложений Windows 8 / 81. / 10 / UWP / WinRT, которые основаны на System.Runtime, и .NET Core также основан на нем.   -  person Tseng    schedule 13.10.2016
comment
так это расширение недоступно в .Net Core из коробки?   -  person LP13    schedule 13.10.2016
comment
Если вы не добавите этот пакет в свой проект, нет, он недоступен. Это HttpClient расширение. Совершенно не связано с ASP.NET или ASP.NET Core. Как видно, nuget.org/packages/Microsoft.AspNet.WebApi.Client здесь он не зависит ни от ASP.NET MVC5, ни от ASP.NET Core MVC. Однако он должен работать с .NET Core, поскольку это PCL, предназначенный для NET 4.5 и Win8 / 8.1. Вам просто нужен оператор "import": [ "portable-net45+win8" ] в project.json   -  person Tseng    schedule 13.10.2016
comment
Возможный дубликат Отправить сообщение HTTP POST в ASP. NET Core с помощью HttpClient PostAsJsonAsync   -  person Set    schedule 13.10.2016


Ответы (13)


Он входит в состав библиотеки Microsoft.AspNet.WebApi.Client https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Client/

person Oliver    schedule 15.04.2019
comment
Думаю, теперь это должен быть правильный ответ. Пакет доступен и поддерживает стандарт .Net 2.0. - person Juan; 13.06.2019

Я не заслуживаю за это никакой заслуги. Посмотрите ответ @ danroth27 по следующей ссылке.

https://github.com/aspnet/Docs/blob/master/aspnetcore/mvc/controllers/testing/sample/TestingControllersSample/tests/TestingControllersSample.Tests/IntegrationTests/HttpClientExtensions.cs

Он использует метод расширения. Код, как показано ниже. (Скопировано по указанной выше ссылке на github). Я использую его в .Net Core 2.0.

using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace TestingControllersSample.Tests.IntegrationTests
{
    public static class HttpClientExtensions
    {
        public static Task<HttpResponseMessage> PostAsJsonAsync<T>(
            this HttpClient httpClient, string url, T data)
        {
            var dataAsString = JsonConvert.SerializeObject(data);
            var content = new StringContent(dataAsString);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            return httpClient.PostAsync(url, content);
        }

        public static async Task<T> ReadAsJsonAsync<T>(this HttpContent content)
        {
            var dataAsString = await content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<T>(dataAsString);
        }
    }
}
person JenonD    schedule 01.11.2017
comment
Эта ссылка больше не работает. github.com/dotnet/corefx/issues/26233 Как и в вышеприведенном комментарии, получившем высокую оценку, Microsoft теперь рекомендует пакет NuGet. - person Lex Li; 05.12.2018

Это не является частью проекта ASP.NET Core. Однако вы можете продолжить:

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://myurl/api");

string json = JsonConvert.SerializeObject(myObj);

request.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

HttpClient http = new HttpClient();
HttpResponseMessage response = await http.SendAsync(request);

if (response.IsSuccessStatusCode)
    {                
    }
else
    {
    }
person GorvGoyl    schedule 04.07.2017
comment
Не забудьте удалить переменные запроса и http. - person Rolf; 26.09.2017

Вы можете использовать это расширение для использования метода PostAsJsonAsync в ядре ASP.NET

using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;
public static class HttpClientExtensions
{
    public static Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient httpClient, string url, T data)
    {
        var dataAsString = JsonConvert.SerializeObject(data);
        var content = new StringContent(dataAsString);
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        return httpClient.PostAsync(url, content);
    }

    public static Task<HttpResponseMessage> PutAsJsonAsync<T>(this HttpClient httpClient, string url, T data)
    {
        var dataAsString = JsonConvert.SerializeObject(data);
        var content = new StringContent(dataAsString);
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        return httpClient.PutAsync(url, content);
    }

    public static async Task<T> ReadAsJsonAsync<T>(this HttpContent content)
    {
        var dataAsString = await content.ReadAsStringAsync().ConfigureAwait(false);

        return JsonConvert.DeserializeObject<T>(dataAsString);
    }
}

см. https://jonlabelle.com/snippets/view/csharp/httpclient-extensions

person j.ghadiri    schedule 27.08.2019

это прибывает поздно, но я думаю, что это может помочь кому-то в будущем. Таким образом, *AsJsonAsync() методы не являются частью проекта ASP.NET Core. Я создал пакет, который дает вам эту функциональность. Вы можете получить его на Nuget.

https://www.nuget.org/packages/AspNetCore.Http.Extensions

using AspNetCore.Http.Extensions;
...
HttpClient client = new HttpClient();
client.PostAsJsonAsync('url', payload);
person Bolorunduro Winner-Timothy    schedule 16.12.2017

Начиная с .NET 5.0, он был (повторно) представлен как метод расширения от HttpClient через пространство имен System.Net.Http.Json. См. HttpClientJsonExtensions, чтобы узнать подробности.

Демонстрация

Это работает примерно так:

var httpClient  = new HttpClient();
var url         = "https://StackOverflow.com"
var data        = new MyDto();
var source      = new CancellationTokenSource();

var response    = await httpClient.PostAsJsonAsync<MyDto>(url, data, source.Token);

И, конечно же, вам нужно будет сослаться на некоторые пространства имен:

using System.Net.Http;          //HttpClient, HttpResponseMessage
using System.Net.Http.Json;     //HttpClientJsonExtensions
using System.Threading;         //CancellationToken
using System.Threading.Tasks;   //Task

Фон

Это основано на проектный документ, на который ранее ссылался @erandac, хотя дизайн с тех пор изменился, особенно для PostAsJsonAsync() метод.

Очевидно, это не решает проблему для тех, кто все еще использует .NET Core, но с Выпущена .NET 5.0, теперь это лучший вариант.

person Jeremy Caney    schedule 13.06.2020
comment
Это решение также работает для .NET Core 3.0 и новее. Вам нужно добавить пакет NuGet System.Net.Http.Json - person nt86; 22.10.2020

Вам нужно добавить пакет Nuget System.Net.Http.Formatting.Extension в свой проект.

Или вы можете использовать

client.PostAsync(uri, new StringContent(data, Encoding.UTF8, "application/json"));
person ANJYR    schedule 13.04.2019
comment
Вопрос касался именно вспомогательного метода PostAsJsonAsync - person Oliver; 15.04.2019

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

Раньше я использовал веб-приложение .NET Core 2.1 с использованием метода PostAsJsonAsync(), и когда я обновился до .NET Core 3.1, он больше не работал.

Я не мог заставить приведенные выше ответы работать, и это оказалось потому, что текст, который должен был быть опубликован, должен был быть окружен кавычками, а любые кавычки в нем должны были быть экранированы. Я сделал следующий метод расширения, который решил мою проблему:

public static async Task<HttpResponseMessage> PostJsonAsync(this HttpClient client, string uri, string json)
{
    //For some reason, not doing this will cause it to fail:
    json = $"\"{json.Replace("\"", "\\\"")}\"";

    return await client.PostAsync(uri, new StringContent(json, Encoding.UTF8, "application/json"));
}

Обратите внимание, что я использую System.Text.Json.JsonSerializer, а не версию Newtonsoft.

person Greg    schedule 02.03.2020

сделать метод расширения действительно асинхронным:

public static async Task<HttpResponseMessage> PostAsJsonAsync<T>(
    this HttpClient httpClient, string url, T data)
{
    var dataAsString = JsonConvert.SerializeObject(data);
    var content = new StringContent(dataAsString);
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    return await httpClient.PostAsync(url, content);
}
person f.capet    schedule 24.07.2019

МетодPostAsJsonAsync (вместе с другими *Async методами класса HttpClient) действительно доступен из коробки - без использования директив.

Ваш .csproj файл должен начинаться с <Project Sdk="Microsoft.NET.Sdk.Web"> и содержать строки

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

Я считаю, что это дубликат, и дал более подробный ответ на https://stackoverflow.com/questions/37750451#58169080.

(PackageReference больше не требуется в .NET Core 3.0.)

person Henke    schedule 04.10.2019

Если вы пытаетесь использовать PostJsonAsync, PutJsonAsync или любые другие методы расширения json в Blazor, вам необходимо добавить следующий оператор

using Microsoft.AspNetCore.Components;
person Pavel Anpin    schedule 11.11.2019

Сама среда выполнения ядра Dotnet 3.x будет иметь набор методов расширения для HttpClient, который использует сериализатор System.Text.Json

https://github.com/dotnet/designs/blob/main/accepted/2020/json-http-extensions/json-http-extensions.md

person erandac    schedule 13.03.2020

person    schedule
comment
Я не могу найти никаких доказательств того, что это существует в этом классе - или, фактически, даже найти документацию этого класса. Я не говорю, что его не существует, просто читателям будет сложно найти информацию о том, как его использовать, имея только ссылку на пространство имен. Можете ли вы обновить свой ответ, включив как минимум рабочий пример и, в идеале, ссылку на документацию? Кроме того, зависит ли это от пакета Microsoft.AspNetCore.Blazor.HttpClient (предварительная версия)? Если да, обязательно обратите внимание на это. - person Jeremy Caney; 13.06.2020
comment
Лучшая документация, которую я могу найти фактически указывает на BCL .NET 5.0 (предварительная версия), который, если вы его используете, вам не нужно полагаться на пакет Blazor. Я добавил ответ, который предоставляет информацию о версии .NET 5.0 для тех, кто находится в процессе перехода с .NET. Ядро до .NET 5.0. - person Jeremy Caney; 13.06.2020