Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 升级到.Net Core 3.0后,Post请求值始终为空_C#_Json_Asp.net Core_.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 升级到.Net Core 3.0后,Post请求值始终为空

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

我已经尝试了我找到的所有解决方案,但大多数都不适用于我的问题。我使用JSON发送post请求,在3.0版本之前,它们工作正常。
您可以在我的控制器中看到我有
[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