在 Web API 中使用 Contract.Requires 进行验证

4

我正在开发基于MVC5 / Web API的应用程序。在一些文章中,我读到了使用Contract.RequiresSystem.Diagnostics.Contracts命名空间的一部分)来验证传入数据的方法。

这是验证传入数据的正确方法吗?另外,由于调试器总是忽略这行代码,因此我无法调试Contract.Requires行。我正在使用Visual Studio 2013。

    public async Task<UserInfo> Put(
        [FromBody] UserInfo userInfo) {
        Contract.Requires(userInfo != null);
        ..............
     }

有人能解释一下什么时候使用 Contract.Requires,以及在哪些情况下需要避免使用吗?


1
https://msdn.microsoft.com/zh-cn/library/dd264808.aspx - Claies
3个回答

3

为什么需要合同呢?

在API方法中,您可以使用HttpResponseMessage:

[HttpPost]
    public HttpResponseMessage Put(UserInfo userInfo) {
     if(ModelState.IsValid)
    {
     // your code
    return Request.CreateResponse(HttpStatusCode.OK);
    }
    else
    {
    return Request.CreateResponse(HttpStatusCode.BadRequest, new { msg = "invalid data" });
    }
    }

and or :

  [HttpPost]
        public async Task<ActionResult> Put(UserInfo userInfo) {
         if(ModelState.IsValid)
        {
         // your code
        return Request.CreateResponse(HttpStatusCode.OK);
        }
        else
        {
        return Request.CreateResponse(HttpStatusCode.BadRequest, new { msg = "invalid data" });
        }
        }

3
您当然可以在您的控制器中使用代码合同,但是以下是一些缺点和您可能不需要合同的原因。
- 在API响应中丢失错误细节:代码合同失败将返回给客户端一个HTTP 500内部服务器错误,很可能没有详情,这对API的客户端没有帮助。这是因为合同故障会导致异常抛出。您可能希望抛出HttpResponseException并附上自己的详细信息,或者自己定制一个HttpResponseMessage。在这种情况下(除非您自己处理全局异常),代码合同可能没有意义。 - Contract.Requires可能是多余的:考虑Web API如何已经验证您的参数。例如,缺少参数可能导致无效路由,因此请求被拒绝并且方法不被调用。在这个方法中,代码合同是无用的。 - 您为什么需要合同?代码合同非常适合在编译时捕获合同失败。但是,除非您的API客户端也是.NET项目,否则无法利用该功能。因此,请考虑您可能需要合同做什么以及是否有利于它们的使用。

2
虽然Keith指出了在Web.Api中使用Code Contracts的一些缺点,但我想分享一些想法,即它们可能有意义或有用。
通过使用Code Contracts,您可以以标准方式进行输入验证和参数验证(如断言甚至是后置条件)。这意味着您可以以相同的方式编写代码-无论您是在ApiController中还是在其他一些代码片段中(例如异步工作线程)。
当然,向客户端发送的一般HTTP 500消息并不实用,因此我们将Code Contracts与标准Web.Api异常处理程序(HttpStatusExceptionFilterAttribute)结合使用。此异常处理程序将检查消息并将自定义HTTP错误代码发送回客户端(可选地连同失败的条件),并且可以将完整的堆栈跟踪记录到您的中央应用程序日志设施中。
通过利用这两个功能,您可以清理和简化代码,同时为客户端提供友好且有意义的错误信息,并仍然保留完整的错误信息以供内部故障排除。
您可以查看这篇文章,其中更详细地解释了它:Using CodeContracts with OData Controllers and Web.Api Exception Filters 希望这可以帮助您。
此致
敬礼,
罗纳德

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接