如果我开发了一个WebApi动作方法
[Route]
public string Put([FromBody]MyClass value)
使用在构造函数中具有参数验证的MyClass类是非常糟糕的,如:
public MyClass(string value)
{
if (!_pattern.IsMatch(value))
throw new ArgumentException($"Value should match RegEx: {_pattern}", nameof(value));
}
因此,在错误的请求中,它会从JsonMediaTypeFormatter.ReadFromStreamAsync中抛出异常,这会发生在控制器或操作过滤器之外,所以我找不到用ArgumentException
消息来回复客户端的真实问题描述的方法。
即使是这样的参数检查还没有放在DTO中,WebApi和真实(域模型)MyClass中唯一允许的是否应该创建相应的简单契约类而不进行任何检查?
答案 0 :(得分:1)
使用API中的结构化消息创建ErrorDto。有ExceptionFilter来处理这个问题是很常见的做法。
就验证反馈而言,您可能需要查看this article by Martin Fowler about avoiding to use exceptions as an approach to validation。
话虽如此,你可能会发现this library interesting。
答案 1 :(得分:1)
顺便说一下,我发现如果Dto从构造函数(控制器外)抛出ArgumentException,你仍然可以使用
[Route]
[ValidateModel]
public string Put([FromBody]MyClass value)
和
{
"Message": "The request is invalid.",
"ModelState": {
"value": [
"Value should match RegEx: ...\r\nParameter name: value"
]
}
}
那将通过
回复客户{{1}}
但是,当纯DTO与DataAnnotations指定所有问题时,它仍然只允许通知第一个发现的问题。