.NET Core 捕获中间件中的 Json 反序列化错误

2024-02-08

我确信我错过了一些明显的东西。

是否可以在.NET Core的默认中间件/反序列化器中处理JSON反序列化错误?我需要确保特定值是 JSON 原语而不是对象/数组。如果它不是原语,我想在请求到达控制器之前终止请求并返回适当的状态代码。

控制器:

[HttpPost]
public IActionResult Post([FromBody] List<MyType> myTypes)
{
    // Logic ....

    return Created(new Uri("some-location/", UriKind.Relative), someValue);
}

请求正文:

[
    {
        "prop1": "some value",
        "prop2": "some value",
        "prop3": null
    },
    {
        "prop1": "some value",
        "prop2": "some value",
        "prop3": {
            "prop3-1": "some value"
        }
    }
]

The MyType构造函数检查传入的参数,如果存在问题则抛出异常。prop3 in MyType is a dynamic场地。我已经验证当请求正文中的第二项被反序列化时会引发异常。

这一切感觉非常简单,但我只是找不到访问默认解串器的位置。

I tried this https://blogs.msdn.microsoft.com/brandonh/2017/07/31/using-middleware-to-trap-exceptions-in-asp-net-core/它确实捕获错误,但仅在请求进入控制器之后才捕获。

有没有办法在 JSON 注释中处理这个问题?我浏览了 Newtonsoft 文档,但什么也没跳出来。


查看此处的文档:https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.1 https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.1我认为您正在寻找的是 AddJsonOptions()

在 Startup.cs 中:

services.AddMvc().AddJsonOptions(options =>
{
     options.SerializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Error;
});

这不会抛出异常,但会绑定失败,因此 myTypes 变为 null。

然后你可以添加一个空检查

[HttpPost]
public IActionResult Post([FromBody] List<MyType> myTypes)
{
    if(myTypes == null)
    {
        return BadRequest();
    }

    // Logic ....

    return Created(new Uri("some-location/", UriKind.Relative), someValue);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET Core 捕获中间件中的 Json 反序列化错误 的相关文章

随机推荐