我们应该在异常时发送什么响应代码 - WebAPI?

时间:2014-07-10 10:40:32

标签: c# .net exception asp.net-web-api asp.net-web-api2

我正在编写Web-API方法。一种这样的方法类似于

public IHttpActionResult Post([FromBody]MyDTO)
{
   //validations 

   try
   {
      InsertInToDB(MyDTO.SomeField);
   }
   catch(Exception ex)
   {
      // Say some exception has occurred while inserting in to DB. For eg. SomeField is not a acceptable value.
      // What is the response that I should send to the API user ?
      // Notfound, BadRequest does not seem to be fit in this case.
   }

}

注意:InsertIntoDB会返回void

现在,如果在该方法中发生了一些异常,我应该向用户发送HttpStatusCode那个?

NotFoundBadrequest回复似乎不适合这种情况。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

您发回的例外取决于一些事情。

首先,用户是否向您发送了错误的信息?或者你的服务器搞砸了?

4XX状态代码适用于用户搞砸的情况。

4XX:

如果问题是用户发送了格式错误的请求,请返回400 Bad Request

如果问题是您正在使用POST来确定资源是否存在(例如通过搜索),那么如果找不到他们尝试访问的资源,则404 Not Found是合适的。

如果问题是插入此值会导致现有值出现问题(例如它们具有完全相同的名称而不应该;或者其他一些验证错误:409 Conflict是合适的。< / p>

5XX

5XX状态代码适用于代码搞砸的情况。用户做的一切都很正确,但你仍然搞砸了。

例如,if your database is down, a 500 or 503 is appropriate

顺便说一句,抓住毯子Exception是不好的。在这种情况下,如果您有不同的验证,则应创建可在出现验证错误时抛出的异常类;区别于用户做一切写入但代码出错。

在这种情况下,我有:

ValidationFailedException - &gt; Web层返回400 ConflictException - &gt; Web Tier返回409 ItemDoesNotExistException - &gt; Web层返回404

请注意,您的数据层不应该依赖于Web层或任何与Internet相关的内容。这意味着你应该有内部的Exception类;抛出这些,并使用它们在您的Web层中生成适当的HttpException