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

时间:2014-04-27 11:42:14

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

问题:

我需要处理web api 2异常并返回一个带有正确状态代码的富对象(401为Unauthorized,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,这不像强类型操作那样容易测试和读取。)

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

2 个答案:

答案 0 :(得分:8)

或者您可以使用内置的,开箱即用的解决方案:exception filters

此外,您可能对exception handling starting from Web API 2.x感兴趣。

答案 1 :(得分:1)

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

因此,我会采用您的第二种方法(尽管您不需要自定义动作结果)。使用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