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

时间:2016-10-13 17:23:34

标签: asp.net-core coreclr

我在ASP.NET核心中寻找/^[\d\(\)\-]+$/.test('(12321)213213d') 扩展方法。根据{{​​1}}汇编中提供的文章here。不过我虽然微软已将所有程序集名称从PostAsJsonAsync更改为Microsoft.AspNet.WebApi.Client,但更具体地说是.Net Core框架。但我找不到Microsoft.AspNet

ASP.NET核心中的Microsoft.AspNetCore扩展方法在哪里?

16 个答案:

答案 0 :(得分:32)

我不值得信任。请看以下链接中的@ 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);
        }
    }
}

答案 1 :(得分: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
    {
    }

答案 2 :(得分:4)

.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

背景

这是基于the design document(以前是referenced by @erandac)的,尽管此后设计有所改变,尤其是对于PostAsJsonAsync()方法。

显然,对于仍然使用.NET Core的任何人来说,这都不能解决问题,但是对于.NET 5.0 released,这现在是最好的选择。

答案 3 :(得分:3)

这是迟到的,但我认为这可能有助于某人下线。因此*AsJsonAsync()方法不是ASP.NET核心项目的一部分。我创建了一个为您提供功能的包。你可以在Nuget上得到它。

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

using AspNetCore.Http.Extensions;
...
HttpClient client = new HttpClient();
client.PostAsJsonAsync('url', payload);

答案 4 :(得分:2)

要从上述答案中继续学习,我需要添加一小部分才能使其正常工作。

以前,我使用的是PostAsJsonAsync()方法的.NET Core 2.1 Web应用程序,当我升级到.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版本。

答案 5 :(得分:1)

只需将您的Nuget软件包更新到SDK .Net Core 2.1或最新的.Net Core SDK中,它就会起作用。

答案 6 :(得分:1)

您需要将Nuget软件包System.Net.Http.Formatting.Extension添加到您的项目中。

或者您可以使用

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

答案 7 :(得分:0)

这是理论上的......

public static async System.Threading.Tasks.Task<HttpResponseMessage> PostJsonAsync(object dataclass, string Url)
    {
        using (var client = new HttpClient())
            return await client.PostAsync(Url, new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(dataclass), System.Text.Encoding.UTF8, "application/json"));
    }

......手指交叉。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

使扩展方法真正异步:

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

答案 10 :(得分:0)

您可以使用此扩展在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);
    }
}

请参阅:https://jsfiddle.net/David_A_BTW/sq63y02p/33/

答案 11 :(得分:0)

方法PostAsJsonAsync(以及*Async类的其他HttpClient方法) 确实可以直接使用-无需使用指令。

您的.csproj文件应以<Project Sdk="Microsoft.NET.Sdk.Web">开头, 并包含行

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

我认为这是重复的,并在以下位置给出了更详细的答案 https://stackoverflow.com/questions/37750451#58169080

(。NET Core 3.0中不再需要PackageReference。)

答案 12 :(得分:0)

如果您尝试在Blazor中使用PostJsonAsync,PutJsonAsync或任何其他json扩展方法,则需要添加以下语句

using Microsoft.AspNetCore.Components;

答案 13 :(得分:0)

Dotnet核心3.x运行时本身将具有使用System.Text.Json序列化程序的HttpClient扩展方法集

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

答案 14 :(得分:0)

如果您在 2021 年并且拥有 .Net Core 3.1,请确保在您的项目文件 csproj 中,Microsoft.AspNetCore.App 是最新的,最新的是 2.2.8。您可以按如下方式检查和更新包:

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

然后像这样从 cli 恢复您的项目:

dotnet restore

答案 15 :(得分:-3)

'owner'