在 WebAPI 之前,我使用常规 MVC 操作方法进行所有客户端远程验证调用。使用 WebAPI,我现在可以在 ApiController 上使用 POST、PUT、DELETE 和 GET 方法。但是,仍然需要进行验证。
我已经成功地将远程验证操作方法放在 ApiController 上并让它们工作。在为资源提交 POST、PUT 或 DELETE 之前,客户端可以 POST 到一个或多个验证 URL 以验证用户输入并接收适当的验证消息。
我的问题是,这些远程验证操作是否应该在 ApiController 上?还是常规的 MVC 控制器?在我看来,将它们全部放在 ApiController 中是最有意义的,因为该类可以封装与资源(和资源集合)突变有关的所有内容。
更新:回复@tugberk
我应该详细说明。首先,我们没有使用 DataAnnotations 验证。已经使用 FluentValidation.NET 在域层命令上配置了丰富的验证规则和消息。许多验证类使用依赖注入来调用数据库(例如验证唯一性)。FluentValidation 与 MVC ModelState 有很好的可插拔性,但我还没有找到将其插入 WebAPI ModelState 的好方法。
其次,我们在 POST、PUT 和 DELETE 端点进行验证。客户端无需知道验证端点即可发现问题所在。这是一个例子:
var command = Mapper.Map<CreateCarCommand>(carApiModel);
try
{
_createHandler.Handle(command);
}
catch (ValidationException ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
客户将收到 400 响应以及指示出了什么问题的消息。当然,这不像您链接到的示例中的响应那么精细。因为我们只是返回一个字符串,所以没有简单的方法来解析每个验证消息属于哪些字段,这是我们自己的 API 的 HTML + javascript 客户端所需要的。这就是为什么我增加了更细粒度的验证端点(作为旁注,它们被我们的 javascript 客户端上特定于字段的敲除验证调用所消耗)。