我在ASP.NET核心中寻找/^[\d\(\)\-]+$/.test('(12321)213213d')
扩展方法。根据{{1}}汇编中提供的文章here。不过我虽然微软已将所有程序集名称从PostAsJsonAsync
更改为Microsoft.AspNet.WebApi.Client
,但更具体地说是.Net Core框架。但我找不到Microsoft.AspNet
ASP.NET核心中的Microsoft.AspNetCore
扩展方法在哪里?
答案 0 :(得分:32)
我不值得信任。请看以下链接中的@ danroth27答案。
他使用扩展方法。代码如下。 (从上面的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);
}
}
答案 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扩展方法集
答案 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'