C# 升级到.Net Core 3.0后,Post请求值始终为空
我已经尝试了我找到的所有解决方案,但大多数都不适用于我的问题。我使用JSON发送post请求,在3.0版本之前,它们工作正常。C# 升级到.Net Core 3.0后,Post请求值始终为空,c#,json,asp.net-core,.net-core,asp.net-core-mvc,C#,Json,Asp.net Core,.net Core,Asp.net Core Mvc,我已经尝试了我找到的所有解决方案,但大多数都不适用于我的问题。我使用JSON发送post请求,在3.0版本之前,它们工作正常。 您可以在我的控制器中看到我有[FromBody],我的模型有属性。这就是我从其他人那里看到的两个问题。您还可以看到我的请求值与我的模型名称相匹配,并且没有遗漏。我找不到可能导致此问题的任何其他原因 编辑- 根据下面的评论,我检查了Json规则。最初的默认规则是使值名称的第一个字符小写的。它在下降的过程中会这样做,但我不知道在向服务器发送值时如何判断这是否会影响它。在将p
您可以在我的控制器中看到我有
[FromBody]
,我的模型有属性。这就是我从其他人那里看到的两个问题。您还可以看到我的请求值与我的模型名称相匹配,并且没有遗漏。我找不到可能导致此问题的任何其他原因
编辑-
根据下面的评论,我检查了Json规则。最初的默认规则是使值名称的第一个字符小写的。它在下降的过程中会这样做,但我不知道在向服务器发送值时如何判断这是否会影响它。在将post值发送到控制器之前,是否有一个断点可以放在某个地方以查看post值
编辑2-
将startup更改为this可以使模型不为null,但所有值都是默认值。字符串为空,整数为0
services.AddControllers().AddJsonOptions(o =>
{
o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
});
从我看到的情况来看,大多数用于更改名称的json选项都不会影响反序列化
Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddControllers();
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
//services.AddMvc();
services.AddTransient<AuthService>();
services.AddTransient<LocationService>();
services.AddTransient<MessageService>();
services.AddTransient<AutoAssignService>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();
app.UseRouting();
// global cors policy
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
}
}
我的控制器方法
[HttpPost]
public IActionResult PostCensusManagement([FromBody] CensusManagementSearch search)
{
}
这是我在请求中发送的数据通常当JSON负载无法绑定到控制器操作的模型时,您会看到
ModelState.IsValid
等于false。在调试和向下钻取时展开ModelState.Values
属性,将给出一个关于JSON解析过程中失败内容的详细错误
请记住,ASP.NET Core 3.0使用了一个新的本机JSON引擎,而不是JSON.NET,后者的局限性要大得多。这可能是某些属性/类型现在无法正确解析的原因
要使用自定义日期格式,您必须实现自己的转换器:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), "MM/dd/yyyy", CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture));
}
}
// In ConfigureServices() of Startup.cs
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
公共类DateTimeConverter:JsonConverter
{
公共覆盖日期时间读取(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
{
return DateTime.ParseExact(reader.GetString(),“MM/dd/yyyy”,CultureInfo.InvariantCulture);
}
公共重写无效写入(Utf8JsonWriter编写器、日期时间值、JsonSerializerOptions选项)
{
writer.WriteStringValue(value.ToString(“MM/dd/yyyy”,CultureInfo.InvariantCulture));
}
}
//在Startup.cs的ConfigureServices()中
services.AddControllers()
.AddJsonOptions(选项=>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
通常,当JSON负载无法绑定到控制器操作的模型时,您会看到ModelState.IsValid
等于false。在调试和向下钻取时展开ModelState.Values
属性,将给出一个关于JSON解析过程中失败内容的详细错误
请记住,ASP.NET Core 3.0使用了一个新的本机JSON引擎,而不是JSON.NET,后者的局限性要大得多。这可能是某些属性/类型现在无法正确解析的原因
要使用自定义日期格式,您必须实现自己的转换器:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), "MM/dd/yyyy", CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture));
}
}
// In ConfigureServices() of Startup.cs
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
公共类DateTimeConverter:JsonConverter
{
公共覆盖日期时间读取(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
{
return DateTime.ParseExact(reader.GetString(),“MM/dd/yyyy”,CultureInfo.InvariantCulture);
}
公共重写无效写入(Utf8JsonWriter编写器、日期时间值、JsonSerializerOptions选项)
{
writer.WriteStringValue(value.ToString(“MM/dd/yyyy”,CultureInfo.InvariantCulture));
}
}
//在Startup.cs的ConfigureServices()中
services.AddControllers()
.AddJsonOptions(选项=>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
问题
:此信息没有真正的帮助。它并没有说什么是不起作用的,也就是说,你有没有在任何地方收到任何错误消息,你有没有试着调试这个问题,以确保它确实起到了预期的作用。也许它与?@John_,monica,我倾向于这样的事情。我去看看。如果他们成功了,我会让你知道,你可以把它作为答案。是的,我可能会这么做。您可能需要阅读正文,然后将其倒带。如果将有效负载绑定到模型时出现某种错误,您可以在ModelState
属性中看到它。是否ModelState.IsValid
等于false
?问题
:此信息没有真正的帮助。它并没有说什么是不起作用的,也就是说,你有没有在任何地方收到任何错误消息,你有没有试着调试这个问题,以确保它确实起到了预期的作用。也许它与?@John_,monica,我倾向于这样的事情。我去看看。如果他们成功了,我会让你知道,你可以把它作为答案。是的,我可能会这么做。您可能需要阅读正文,然后将其倒带。如果将有效负载绑定到模型时出现某种错误,您可以在ModelState
属性中看到它。ModelState.IsValid
等于false
?