想知道是否有人可以帮助解决.Net Core Web Api 2.2问题。为了我自己的一生,当验证一个真正简单的api时,无法获得ModelState错误中AttemptedValue或RawValue的值。
因此,请采用以下非常简单的模型:
public class Person
{
public bool Alive { get; set; }
}
控制器:
[HttpPost]
public IactionResult Post([FromBody] Person person)
{
if (!ModelState.IsValid)
{
throw new Exception();
}
return null;
}
我在启动中添加了以下内容:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.Configure<ApiBehaviorOptions>(o =>
{
o.InvalidmodelStateResponseFactory = actionContext =>
new BadRequestObjectResult(actionContext.ModelState);
});
}
因此,使用以下Json做一个简单的帖子
{
"Alive": "a"
}
哪个返回错误,但是检查ModelState却不包含尝试值。更令人讨厌的是,固定错误响应包含所有详细信息。不幸的是,出现固定错误的消息是该消息包含类型错误的转换,因此,例如,如果在模型中使用枚举,则类型名称将开始出现在错误消息中。
那么,下面的错误消息从哪里获取模型值?在ModelState验证之前,是否需要进行一些json序列化?
{
"Alive": [
"Could not convert string to boolean: a. Path 'Alive',line 2,position 13."
]
}
编辑...经过进一步调查,似乎是JsonInputFormatter验证了请求。我尝试遵循以下文章,并且确实确实表明JsonInputFormatter进行了验证,因为该模型在调用ReadRequestBodyAsync之前是有效的,而在调用之后是无效的。由于模型为空,因此以下链接中的代码失败。看起来所有信息可能都在InputFormatterContext的元数据中,但我不确定。
Extending ModelState to output my own message - how do I get model state value
编辑2 ...看来,直接从Json.net的JsonSerializationException类抛出的序列化异常中捕获了modelstate中的错误。检查此异常,我看不到传入的无效值,该值在异常消息中清晰可见。
谢谢