Validation 服务器端验证是否适合使用ASP.NET WebAPI ApiController操作

Validation 服务器端验证是否适合使用ASP.NET WebAPI ApiController操作,validation,asp.net-mvc-4,asp.net-web-api,remote-validation,Validation,Asp.net Mvc 4,Asp.net Web Api,Remote Validation,在WebAPI之前,我使用常规MVC操作方法执行所有客户端远程验证调用。有了WebAPI,我现在可以在ApicController上使用POST、PUT、DELETE和GET方法。然而,仍然需要进行验证 我已经成功地将远程验证操作方法放在ApiController上并使它们工作。在提交资源的POST、PUT或DELETE之前,客户端可以发布到一个或多个验证URL,以验证用户输入并接收适当的验证消息 我的问题是,这些远程验证操作应该在ApiController上吗?还是普通的MVC控制器?在我看来

在WebAPI之前,我使用常规MVC操作方法执行所有客户端远程验证调用。有了WebAPI,我现在可以在ApicController上使用POST、PUT、DELETE和GET方法。然而,仍然需要进行验证

我已经成功地将远程验证操作方法放在ApiController上并使它们工作。在提交资源的POST、PUT或DELETE之前,客户端可以发布到一个或多个验证URL,以验证用户输入并接收适当的验证消息

我的问题是,这些远程验证操作应该在ApiController上吗?还是普通的MVC控制器?在我看来,将它们全部放在ApiController中最有意义,因为该类可以封装与资源(和资源集合)突变有关的所有内容

更新:回复@tugberk

我应该详细说明。首先,我们不使用DataAnnotations验证。使用FluentValidation.NET在域层命令上已经配置了丰富的验证规则和消息。许多验证类使用依赖项注入来调用数据库(例如验证唯一性)。FluentValidation与MVCModelState具有良好的可插拔性,但是

其次,我们在POST、PUT和DELETE端点上进行验证。客户端不需要知道验证端点就可以发现哪里出了问题。以下是一个例子:

var command = Mapper.Map<CreateCarCommand>(carApiModel);
try
{
    _createHandler.Handle(command);
}
catch (ValidationException ex)
{
    return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
var命令=Mapper.Map(carApiModel);
尝试
{
_Handle(命令);
}
捕获(ValidationException ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest,ex.Message);
}

客户端将收到400条响应,并显示出错的消息。诚然,这并不像您链接到的示例中的响应那样精细。因为我们只是返回一个字符串,所以没有简单的方法来解析每个验证消息所属的字段,这是我们自己的HTML+javascript API客户端所需要的。这就是为什么我增加了更多细粒度的验证端点(作为旁注,它们被javascript客户端上特定于字段的敲除验证调用使用)。

我假设您所指的是类似于ASP.NET MVC远程验证的内容,即远程验证。在这种情况下,我认为您的HTTP API不需要远程验证。考虑一个场景,我需要在.NET应用程序中使用您的HTTP API,并假设您有一个远程验证。有两件事困扰着我:

  • 除非您自己为API提供一个.NET客户端,并将该逻辑放在该客户端中,否则无法发现远程验证
  • 假设.NET客户端存在远程验证,并且应用程序将在发送实际请求之前向服务器发出验证调用,这只是一种过激行为
  • 在我看来,用户向您的API发送请求,您应该在那里进行验证。您可以从以下URL中找到示例:


    感谢您提出这些要点。我已经更新了问题的答案。@danludwig查看一下
    ModelValidatorProvider
    扩展点。这不像pie那么简单,但通过查看默认实现,您可以为FluentValidation创建自己的
    ModelValidatorProvider
    ,并将其注册到系统中。我找到了一个链接,并用它更新了我的问题。显然已经存在对WebAPI FluentValidation.NET ModelValidatorProvider的请求。我想我宁愿等待,同时,继续我目前的方法(只要我没有听到更多令人信服的反对理由)。这很有效,也不是很难。