Asp.net mvc NewtonSoft JSON在使用MissingMemberHandling时未引发异常。错误

Asp.net mvc NewtonSoft JSON在使用MissingMemberHandling时未引发异常。错误,asp.net-mvc,asp.net-core,exception,jsonconverter,Asp.net Mvc,Asp.net Core,Exception,Jsonconverter,我们使用Newtonsoft Json转换器来反序列化API请求。由于我们不希望在后端接收不属于请求类的数据/成员,我们将SerializerSettings.MissingMemberHandling设置为MissingMemberHandling.Error: services.AddControllers().AddNewtonsoftJson(a => { a.SerializerSettings.MissingMemberHandling = Missin

我们使用Newtonsoft Json转换器来反序列化API请求。由于我们不希望在后端接收不属于请求类的数据/成员,我们将
SerializerSettings.MissingMemberHandling
设置为
MissingMemberHandling.Error

services.AddControllers().AddNewtonsoftJson(a =>
    {
        a.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
    }
但我们没有收到异常,而是为API调用提供了一个“null”请求对象:


我们为什么不得到一个异常?

我不知道您是如何配置Newtonsoft.Json的。我举了一个有效的例子。这是步骤

  • 添加以下Nuget包

    Microsoft.AspNetCore.Mvc.NewtonsoftJson

  • Startup.cs
    中配置它

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

    [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; }
    }
    
  • 然后我访问操作


  • 我发现了问题:我的控制器配置如下:

    [Route("api/[controller]")]
    public class MyController
    {
    }
    
    由于在添加缺少的成员设置之前,一切都正常工作,因此我没有想到缺少的属性
    [ApiController]
    。添加这一点,使该控制器在Json序列化方面与其他控制器类似

    [Route("api/[controller]")]
    [ApiController]  // <- added this
    public class MyController
    {
    }
    
    [路由(“api/[控制器]”)]
    
    [ApiController]//这是我已经做过的-但我对此进行了深入研究,似乎问题只出现在一个API控制器中。需要注意的是,API控件允许匿名API调用,而其他控件则不允许。但您的此处也允许匿名呼叫……是的,我添加了
    [ApiController]
    。这是全部代码。谢谢你,卡尼。我对你的帖子投了更高的票,因为它提供了一个很好的完整源代码和完整功能的演示,演示了我正在使用的aspecting,但实际的问题在于缺少[ApicController]属性。因此,我将检查我自己的答案作为我问题的实际答案。