c# - Contract.Requires 在 web api 中进行验证

标签 c# asp.net-mvc asp.net-web-api code-contracts

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

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

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

谁能解释一下何时使用 Contract.Requires 以及在何处避免使用?

最佳答案

您当然可以在 Controller 中使用代码契约,但这里有一些缺点和您可能不需要契约的原因。

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

  • Contract.Requires 可能是多余的:考虑 Web API 可能已经在验证您的参数。例如,缺少参数可能会导致路由无效,因此请求会被拒绝并且不会调用该方法。代码契约在此方法中将毫无用处。

  • 为什么需要契约?代码契约非常适合在编译时捕获契约失败。但除非您的 API 客户端也是 .NET 项目,否则您无法利用该功能。因此,请考虑您可能还需要契约(Contract)做什么,以及是否证明它们的使用是合理的。

关于c# - Contract.Requires 在 web api 中进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33764941/

相关文章:

c# - 线程未按预期启动

c# - 移动跨平台游戏开发的最佳编程语言

asp.net-mvc - ASP.NET MVC Html.RadioButton 异常

asp.net-mvc - 如何阻止来自 IIS7 中托管的 ASP.NET MVC 1.0 应用程序内部的所有 *.php、*.cgi 等页面的请求?

c# - c# WebAPI 中的异常处理程序

c# - 在 Entity Framework 中使用 .include 创建巨大的查询?

c# - SQLite 基本示例

c# - 具有非 bool 值的 MVC CheckBoxList 模型绑定(bind)

odata - 从 .NET OData 4 客户端调用嵌套 Expand() 的正确方法

rest - 深度对象路由的 Web API 最佳实践