升级到.Net Core 3.0后,发布请求值始终为空

时间:2019-12-11 05:56:17

标签: c# json asp.net-core .net-core asp.net-core-mvc

我已经尝试了所有找到的解决方案,但大多数不适用于我的问题。我正在使用JSON发送帖子请求,直到3.0,它们都可以正常工作。
您可以在控制器中看到我有[FromBody],并且我的模型具有属性。这些是我从其他人那里看到的两个问题。您还可以看到我的请求值与我的模型名称匹配,并且没有丢失。我找不到其他可能导致此问题的东西。

编辑- 根据以下评论,我检查了适当的Json规则。最初,存在默认规则,该规则使值名称的第一个字符变为小写。它会在下降过程中做到这一点,但是我不知道在将值发送到服务器时如何判断这是否会影响它。在将发布的值发送到控制器之前,是否可以在其中放置一个断点来查看发布的值?

Edit2- 将启动更改为该值会使模型不为空,但所有值均为默认值。字符串为空,整数为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();
            });
        }
    }

请求模型

public class CensusManagementSearch
{
    public int LocationId { get; set; }
    public int PracticeId { get; set; }
    public string Name { get; set; }
    public int StatusId { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public bool Print { get; set; }
}

我的控制器方法

[HttpPost]
public IActionResult PostCensusManagement([FromBody] CensusManagementSearch search)
{
}

这是我在请求中发送的数据enter image description here

1 个答案:

答案 0 :(得分:2)

通常,当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());
         });