C# 需要在web api中进行验证

C# 需要在web api中进行验证,c#,asp.net-mvc,asp.net-web-api,code-contracts,C#,Asp.net Mvc,Asp.net Web Api,Code Contracts,我正在开发基于MVC5/WebAPI的应用程序。在我读过的一些文章中,使用Contract.Requires(系统.Diagnostics.Contracts命名空间的一部分)来验证传入数据 这是验证传入数据的正确方法吗?另外,我无法调试契约。需要行,因为调试器总是绕过这一行。我正在使用Visual Studio 2013 public async Task<UserInfo> Put( [FromBody] UserInfo userInfo) {

我正在开发基于MVC5/WebAPI的应用程序。在我读过的一些文章中,使用
Contract.Requires
(系统.Diagnostics.Contracts命名空间的一部分)来验证传入数据

这是验证传入数据的正确方法吗?另外,我无法调试
契约。需要
行,因为调试器总是绕过这一行。我正在使用Visual Studio 2013

    public async Task<UserInfo> Put(
        [FromBody] UserInfo userInfo) {
        Contract.Requires(userInfo != null);
        ..............
     }
公共异步任务放置(
[FromBody]用户信息用户信息){
Contract.Requires(userInfo!=null);
..............
}

有人能解释一下什么时候使用
合同。需要
以及在哪里避免吗?

您当然可以在控制器中使用代码合同,但以下是一些您可能不需要合同的缺点和原因

  • API响应中的错误详细信息丢失:代码约定失败将作为HTTP 500内部服务器错误返回给客户端,可能没有详细信息,这对API的客户端没有帮助。这是因为契约失败导致抛出异常。您可能更愿意抛出带有您自己详细信息的
    HttpResponseException
    ,或者定制
    HttpResponseMessage
    。在这种情况下(除非您使用自己的全局异常处理),代码契约可能没有意义

  • <> <强>合同要求可能是多余的:< /强>考虑Web API可能已经验证了您的参数。例如,缺少参数可能会导致路由无效,因此请求被拒绝,方法不会被调用。在这种方法中,代码契约是无用的

  • 为什么需要契约?代码契约非常适合在编译时捕获契约失败。但是,除非您的API客户端也是.NET项目,否则您无法利用该功能。因此,考虑一下你可能需要什么样的合同来做,如果这证明了他们的用法。

    • 为什么要签订合同

      您可以在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" });
          }
          }
      
      和或:

        [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" });
              }
              }
      
      [HttpPost]
      公共异步任务Put(UserInfo UserInfo){
      if(ModelState.IsValid)
      {
      //你的代码
      返回Request.CreateResponse(HttpStatusCode.OK);
      }
      其他的
      {
      return Request.CreateResponse(HttpStatusCode.BadRequest,new{msg=“invalid data”});
      }
      }
      
      虽然Keith指出了在Web.Api中使用代码契约的一些明显缺点,但我想分享一些想法,看看它们在哪些方面有意义或有用

      有了代码契约,您就有了如何进行输入验证和参数验证(比如断言,甚至post条件)的标准方法。 这意味着您可以用同样的方式编码——无论您是在ApicController内部还是在其他代码段(例如异步工作线程)中

      当然,发送到客户端的一般HTTP 500消息没有帮助,因此我们将代码契约与标准的Web.Api异常处理程序(HttpStatusExceptionFilterAttribute)结合使用。此异常处理程序将检查消息并将自定义HTTP错误代码发送回客户端(可选地连同失败的条件),此外,它还可以将完整堆栈跟踪记录到中央应用程序的日志工具中

      通过利用这两项功能,您可以清理和简化代码,同时为客户提供友好和有意义的错误信息,并保留完整的错误信息,以便进行内部故障排除

      您可以看看这篇文章,进一步解释一下:

      希望这有帮助

      你好,罗纳德。