我正在使用.Net 4.5.1创建一个使用MVC 6的ASP.Net 5应用程序.我有一个POST方法,它使用FromBody参数自动获取对象.
[HttpPost]
public IActionResult Insert([FromBody]Agent agent)
{
try
{
var id = service.Insert(agent);
return Ok(id);
}
catch (Exception ex)
{
return HttpBadRequest(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一个概念的证明,我不会只返回成功的id或错误的完整异常.
当发送有效的JSON时,一切正常.但是,当发送无效的JSON时,我在调试期间收到异常:
抛出异常:Newtonsoft.Json.dll中的'Newtonsoft.Json.JsonReaderException'
附加信息:解析值后,遇到意外字符:l.路径'名称',第2行,第20位.
问题是在此错误之后,该方法被正常调用,但是使用null参数,并且异常不会传播.
我可以检查null并返回一个通用消息,但这并不像原始消息那样有用,它包含重要信息,例如标记名称和无效字符的位置.
所以我想捕获此异常并将其返回给HTTP调用者.我怎么做?像这样的东西:
{"error": "After parsing a value an unexpected character was encountered: l. Path 'Name', line 2, position 20"}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在try/catch块中手动捕获和反序列化JSON,但这对我来说是不可接受的.我想这样做并继续使用FromBody,我发现它很有效率.
在对对象执行模型绑定时,如果任何对象的属性存在类型不匹配,则框架似乎将返回null.例如,考虑这个简单的例子:
public class Client
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime RegistrationDate { get; set; }
}
public class ClientController : Controller
{
[HttpPatch]
public IActionResult Patch([FromBody]Client client)
{
return Ok("Success!");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我提交"ASDF"的HTTP请求年龄属性的值,整个客户端的参数将在贴片法空,不管什么已提交的其他属性.RegistrationDate属性也是一样.因此,当您的控制器操作中的FromBody参数为null时,您如何知道哪些错误导致模型绑定失败(在这种情况下,哪个提交的属性具有错误的类型)?