gpt4 book ai didi

c# - ASP.Net 5 MVC 6 - 如何使用 FromBody 在 POST 上返回无效的 JSON 消息?

转载 作者:太空狗 更新时间:2023-10-29 20:54:03 25 4
gpt4 key购买 nike

我正在使用 .Net 4.5.1 创建一个带有 MVC 6 的 ASP.Net 5 应用程序。我有一个使用 FromBody 参数自动获取对象的 POST 方法。

[HttpPost]
public IActionResult Insert([FromBody]Agent agent)
{
try
{
var id = service.Insert(agent);
return Ok(id);
}
catch (Exception ex)
{
return HttpBadRequest(ex);
}
}

这只是一个概念的证明,我不会在成功时只返回 id 或在出错时返回完整的异常。

当发送一个有效的 JSON 时,一切正常。但是,当发送无效的 JSON 时,我在调试期间遇到异常:

Exception thrown: 'Newtonsoft.Json.JsonReaderException' in Newtonsoft.Json.dll

Additional information: After parsing a value an unexpected character was encountered: l. Path 'Name', line 2, position 20.

问题是在这个错误之后,该方法被正常调用,但是带有一个空参数,并且异常没有传播。

我可以检查 null 并返回一条通用消息,但这不如原始消息有用,原始消息包含重要信息,例如标签名称和无效字符的位置。

所以我想捕获这个异常并返回给HTTP调用者。我怎么做?像这样:

{"error": "After parsing a value an unexpected character was encountered: l. Path 'Name', line 2, position 20"}

我知道我可以在 try/catch block 中手动捕获和反序列化 JSON,但这对我来说是 Not Acceptable 。我想这样做并继续使用 FromBody,我发现它非常有成效。

最佳答案

默认的 JsonInputFormatter 实际上会在遇到错误时返回一个空模型 - 但它会填充 ModelState 并包含所有异常。

因此,您可以通过深入研究 ModelState 来访问所有遇到的错误:

[HttpPost]
public IActionResult Insert([FromBody]Agent agent)
{
if (!ModelState.IsValid)
{
var errors = ModelState
.SelectMany(x => x.Value.Errors, (y, z) => z.Exception.Message);

return BadRequest(errors);
}

// Model is valid, do stuff.
}

上面的输出是所有异常消息的数组,例如:

[
"After parsing a value an unexpected character was encountered: l. Path 'Name', line 2, position 20",
"Another exception message..."
]

JsonInputFormatter - Source

关于c# - ASP.Net 5 MVC 6 - 如何使用 FromBody 在 POST 上返回无效的 JSON 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37277427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com