NewtonSoft JSON 在使用 MissingMemberHandling.Error 时没有引发异常

NewtonSoft JSON not raising Exception when using MissingMemberHandling.Error

我们使用 Newtonsoft Json 转换器反序列化 API 请求。由于我们不想在后端接收不属于请求 class 的 data/members,因此我们将 SerializerSettings.MissingMemberHandling 设置为 MissingMemberHandling.Error:

services.AddControllers().AddNewtonsoftJson(a =>
    {
        a.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
    }

但是我们没有收到异常,而是得到了 API 调用的 'null' 请求对象:

为什么我们没有得到异常?

我不知道你是怎么配置的Newtonsoft.Json。我做了一个工作示例。这是步骤。

  1. 添加以下 Nuget 包。

    Microsoft.AspNetCore.Mvc.NewtonsoftJson

  2. 配置在Startup.cs.

     public void ConfigureServices(IServiceCollection services)
     {
         services.AddControllersWithViews()
             .AddNewtonsoftJson(option=>
             {
                 option.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
             });
     }
    
  3. 添加请求操作和模型。这是所有控制器代码。

    [ApiController]
    [Route("[controller]")]
    public class ValController:Controller
    {
     [AllowAnonymous]
     [HttpPost]
     public IActionResult LoginAsync([FromBody]Login login)
     {
         return Ok(login);
     }
    }
    public class Login
    {
     public string comm { get; set; }
    }
    
  4. 然后我访问这个动作。

我发现了问题:我的控制器是这样配置的:

[Route("api/[controller]")]
public class MyController
{
}

由于在我们添加缺少的成员设置之前一切都按预期工作,所以我没有想到缺少的属性[ApiController]。添加这个,使这个控制器在 Json 序列化方面与其他控制器一样!

[Route("api/[controller]")]
[ApiController]  // <- added this
public class MyController
{
}

为了确保这一点不会被遗忘,我们编写了一个测试来检查所有控制器 类 的这个属性。