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。我做了一个工作示例。这是步骤。
添加以下 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
{
}
为了确保这一点不会被遗忘,我们编写了一个测试来检查所有控制器 类 的这个属性。
我们使用 Newtonsoft Json 转换器反序列化 API 请求。由于我们不想在后端接收不属于请求 class 的 data/members,因此我们将 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
{
}
为了确保这一点不会被遗忘,我们编写了一个测试来检查所有控制器 类 的这个属性。