ASP.NET Web Api 2中的异常处理

本文关键字:异常处理 Api NET Web ASP | 更新日期: 2023-09-27 18:00:27

问题:

我需要处理web api 2异常,并返回一个具有正确状态代码的富对象(401表示未授权,404表示ContentNotFound等)和一些额外信息作为内容。此外,我需要内容看起来像一个序列化的Exception对象(具有messageexceptionMessagestackTrace…属性)。

建议的解决方案:

  1. 创建自定义异常类并编写自定义异常筛选器以应用于任何控制器的操作。这个自定义异常过滤器根据它的类型(我已经定义的自定义异常之一)处理抛出的异常,并通过类似的东西(过滤器的代码)做出相应的响应:

    context.Response = context.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
                                        new Exception("my exception")));
    
  2. 包装已经编写的web api 2 *ActionResult类(System.Web.Http.Results.UnauthorizedResult Unauthorized()System.Web.Http.Results.OkResult Ok()等),并向它们添加一些自定义数据并使用它们,以便每次调用它们时都将结果传递给客户端(在这种情况下,问题是我的控制器的操作的返回类型应该是IHttpActionResult,这不像强类型操作那样易于测试和读取)。

我应该选择什么解决方案?或者还有其他方法可以实现我在这里想要实现的目标吗?

ASP.NET Web Api 2中的异常处理

或者您可以使用内置的开箱即用的解决方案:异常过滤器。

此外,您可能对从Web API 2.x开始的异常处理感兴趣。

据我所知,您不想处理代码引发的异常,而是在操作方法中创建它们。对于代码中的其他区域抛出异常的情况(您在操作中调用的其他内容或其他筛选器,您可以使用异常筛选器或全局错误处理)。

因此,我将采用您的第二种方法(尽管您不需要过多地自定义操作结果)。实际上,使用IHttpActionResult对代码进行单元测试要容易得多,因为您可以直接检查结果类型。事实上,添加IHttpActionResults的原因之一是为了简化单元测试。

您的代码流更简单,因为您不需要抛出来生成错误,并且您可以随时检查ok(returnValue)的内容,如下所示。

[TestMethod]
public void GetProduct_ShouldReturnCorrectProduct()
{
    var testProducts = GetTestProducts();
    var controller = new SimpleProductController(testProducts);
    var result = controller.GetProduct(4) as OkNegotiatedContentResult<Product>;
    Assert.IsNotNull(result);
    Assert.AreEqual(testProducts[3].Name, result.Content.Name);
}

http://www.asp.net/web-api/overview/testing-and-debugging/unit-testing-with-aspnet-web-api