C# Web API 2.0异常处理
我正在使用WebAPI2.0创建我自己的项目。 我的Api包含添加、获取和预订产品的功能 我想处理异常,但有一些问题我有点困惑 我有一个控制器:C# Web API 2.0异常处理,c#,asp.net,rest,asp.net-web-api,asp.net-web-api2,C#,Asp.net,Rest,Asp.net Web Api,Asp.net Web Api2,我正在使用WebAPI2.0创建我自己的项目。 我的Api包含添加、获取和预订产品的功能 我想处理异常,但有一些问题我有点困惑 我有一个控制器:ProdctController带有动作方法AddProdct [Route("~/CKService.svc/author/add")] [HttpPost] public IHttpActionResult AddProduct(ProductRequest request) { ProductManag
ProdctController
带有动作方法AddProdct
[Route("~/CKService.svc/author/add")]
[HttpPost]
public IHttpActionResult AddProduct(ProductRequest request)
{
ProductManager.AddProduct(request.ProductId, request.ProductName,
request.Price);
return Ok(new AddProductResponse()
{
Status = AddProductStatus.Success
};)
}
现在,如果产品已经存在,那么数据访问层将抛出DuplicateKeyException
我想处理这个问题,并像这样回复:
return Ok(new AddProductResponse()
{
Status = AddProductStatus.AlreadyExists
};)
catch DuplicateKeyException
,我怎么做,因为我认为这不是正确的方法[Route("~/CKService.svc/author/add")]
[HttpPost]
public IHttpActionResult AddProduct(ProductRequest request) {
var status = ProductManager.AddProduct(request.ProductId, request.ProductName, request.Price);
var response = new AddProductResponse() {
Status = status
};
if(status == AddProductStatus.Success) {
return Ok(response);
}
return BadRequest(response);
}
对于未按预期完成的请求,避免返回
200 OK
。这将误导提出请求的客户端。HTTP 200不合理-它表示请求成功。改用4xx(错误)代码。409(冲突)适合您对已存在对象的情况
见:
捕捉异常是完全可以的。未经处理的异常将导致500错误(内部服务器错误),这无论如何都没有意义。
相反,您应该捕获异常并返回如下()所示的HTTP错误:
如果是错误,则永远不应返回HTTP 200。ASP.NET Web API中存在异常处理。409冲突-将是合理的HTTP代码。您应返回反映错误的HTTP状态,而不是在“成功”方法中定义的任意代码。利用现有的、定义明确的标准代码。然后,您的响应具有任何通用API客户端都可以处理的内在语义含义。出现问题时返回“OK”实际上会误导客户机应用程序,即使您记录了它,而不是RESTful API的工作原理。@ADyson谢谢,我仍然感到困惑,例如,如果我有book_seat action method,但飞机已经满了,在这种情况下,返回的正确状态代码是什么?您能解释一下为什么要避免使用HTTP 200吗?看看这个:
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.Conflict, message))