0

在 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 客户端上特定于字段的敲除验证调用所消耗)。

4

1 回答 1

0

我假设您通过说remote validation来指代类似于 ASP.NET MVC Remote Validation 的东西。在这种情况下,我认为您的 HTTP API 不需要远程验证。考虑一个场景,我需要将您的 HTTP API 与我的 .NET 应用程序一起使用,并假设您有一个远程验证。这里有两件事困扰我:

  1. 除非您自己为 API 提供 .NET 客户端并将该逻辑放在该客户端中,否则无法发现该远程验证。
  2. 假设 .NET 客户端存在远程验证,并且应用程序将在发送实际请求之前对服务器进行验证调用,这只是一种矫枉过正。

在我看来,用户向您的 API 发送请求,您应该在那里进行验证。您可以从以下 URL 找到示例:

ASP.NET Web API 和处理 ModelState 验证

于 2012-10-31T11:49:55.997 回答