ASP.NET Core中的PostAsJsonAsync方法在哪里?

LP1*_*P13 34 c# .net-core coreclr asp.net-core

PostAsJsonAsync在ASP.NET核心中寻找扩展方法.根据这里的文章,它在Microsoft.AspNet.WebApi.Client组装中可用.不过我虽然微软已将所有程序集名称从Microsoft.AspNet更改Microsoft.AspNetCore为更具体的.Net Core框架.但我找不到Microsoft.AspNetCore.WebApi.Client

PostAsJsonAsyncASP.NET核心中的扩展方法在哪里?

Jen*_*onD 38

我不值得为此付出任何荣誉.看看以下链接中的@ 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 该链接不再有效。https://github.com/dotnet/corefx/issues/26233 与上面的高票评论一样,Microsoft 现在推荐 NuGet 包。 (3认同)

Oli*_*ver 14

它是库https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Client/的一部分Microsoft.AspNet.WebApi.Client

  • 我想这应该是现在的正确答案。该软件包可用并支持 .Net 标准 2.0 (3认同)

jav*_*iri 9

您可以使用此扩展在 ASP.NET 核心中使用 PostAsJsonAsync 方法

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅:httpclient-extensions


Jer*_*yal 8

这不是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
    {
    }
Run Code Online (Sandbox Code Playgroud)


Jer*_*ney 6

.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);
Run Code Online (Sandbox Code Playgroud)

而且,当然,您需要引用一些命名空间:

using System.Net.Http;          //HttpClient, HttpResponseMessage
using System.Net.Http.Json;     //HttpClientJsonExtensions
using System.Threading;         //CancellationToken
using System.Threading.Tasks;   //Task
Run Code Online (Sandbox Code Playgroud)

背景

这是基于@erandac之前引用的设计文档——尽管此后设计发生了变化,特别是对于PostAsJsonAsync()方法。

显然,这并不能解决任何仍在使用 .NET Core 的人的问题,但是随着.NET 5.0 的发布,这现在是最好的选择。

  • 此解决方案也适用于 .NET Core 3.0 及更高版本。您需要添加 NuGet 包 `System.Net.Http.Json` (4认同)

Bol*_*thy 5

这来晚了,但我认为这可能会帮助某人。因此,这些*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);
Run Code Online (Sandbox Code Playgroud)