我正在开发基于 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/