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

now*_*ed. 0 .net c# 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.
   }

}
Run Code Online (Sandbox Code Playgroud)

注意:InsertIntoDB返回一个void

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

NotFound或者Badrequest回答似乎不适合这种情况.有任何想法吗 ?

Geo*_*ker 5

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

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

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

4XX:

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

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

如果问题是插入此值将导致现有值出现问题(例如,它们具有完全相同的名称,它们不应该;或者某些其他验证 - 错误:409 Conflict是合适的.

5XX

5XX状态代码用于代码搞砸的时候.用户做的一切都很正确,但你仍然搞砸了.

举例来说,如果你的数据库停机,500或者503是适当的.

另外,抓毯子Exception很糟糕.在这种情况下,如果您有不同的验证,则应创建可在出现验证错误时抛出的异常类; 区别于用户做一切写入但代码出错.

在这种情况下,我有:

ValidationFailedException- > Web层返回400 ConflictException- > Web Tier返回409 ItemDoesNotExistException- > Web Tier返回404

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