C# Web API 2.0异常处理

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

我正在使用WebAPI2.0创建我自己的项目。 我的Api包含添加、获取和预订产品的功能

我想处理异常,但有一些问题我有点困惑

我有一个控制器:
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
    };)
  • 返回HTTP状态代码200是否合理
  • 如果不向控制器添加
    catch DuplicateKeyException
    ,我怎么做,因为我认为这不是正确的方法
  • 谢谢这里有一个建议。(我要强调的是,这只是您可以选择的众多选项之一)

    重构manager以处理并返回添加产品的状态,然后让操作根据状态返回相应的响应代码

    [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))