C# 需要在web api中进行验证
我正在开发基于MVC5/WebAPI的应用程序。在我读过的一些文章中,使用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) {
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错误代码发送回客户端(可选地连同失败的条件),此外,它还可以将完整堆栈跟踪记录到中央应用程序的日志工具中
通过利用这两项功能,您可以清理和简化代码,同时为客户提供友好和有意义的错误信息,并保留完整的错误信息,以便进行内部故障排除
您可以看看这篇文章,进一步解释一下:
希望这有帮助
你好,罗纳德。