在RESTFul API中向客户端返回有意义的异常

时间:2013-10-17 03:36:08

标签: c# .net asp.net-web-api

我正在使用.net web api开发一些全面的RESTFul API。

基本上已经有一个现有的Web应用程序在运行。我们正在为此开发一款移动应用。由于存在实现,我试图尽可能地重用现有的业务层代码,以便将来更容易维护。

但是,我遇到了一些关于如何将异常返回给客户端的问题。在API层中,我调用一些业务函数来执行操作。业务层执行操作并在某些情况下抛出异常。

e.g。

public void ResultModel Process(InputModel input) {
  if (input is not valid) {
    throw new ApplicationException("some message");
  }
  // keep on processing
}

在API层,我正在尝试捕获所有异常,然后映射到一些预定义的api异常

e.g。

http response code: 404
reason: the country information is incorrect 

http response code: 404
reason: invalid student id is provided

我在API层中思考,除了标准的http状态代码之外,我将创建一些错误状态代码。

例如。

http response code: 404
error code: error0001
reason: the country code is incorrect 

http response code: 404
error code: error0002
reason: invalid student id is provided

然后在API文档中记录错误代码的含义。

但是,通过这样做,我需要在业务层异常和api响应之间创建一个映射。业务层实现不应该知道这种异常。但我可能需要更改抛出异常的所有位置以返回一些带有异常代码的异常以及将异常代码映射到api错误代码的映射。

这是我能解决的问题,但是我所处理的代码库非常大,重新分解和实现这个解决方案的努力非常大。

我想知道是否有更好的设计和更简单的方法来解决这个问题?或者对此有任何想法对我有帮助。

2 个答案:

答案 0 :(得分:2)

您可以通过Dictionary<Type, int>在异常过滤器属性中查找自定义错误代码,{{1}}将(异常)类型映射到相应的错误代码。如果在未找到映射条目时查找失败,则可以返回通用错误代码。

这样,您现有的业务层不需要了解API错误代码。此外,每个异常都会获得尽可能具体的错误代码,并将泛型错误作为后备。

答案 1 :(得分:0)

要使其自动化,您可以生成异常消息的哈希值,然后将其与@ MariusSchultz的答案结合使用,以便为每种类型和消息生成唯一的错误代码。

例如:

throw new ApplicationException("the country code is incorrect");

可以转换为错误代码 1-c955f43ad10c78d1baeca4f1e8a36d52 ,假设字典中的ApplicationException值为1并且您使用MD5哈希。

同样......

throw new SomeCustomException("some message");

可以再次转换为错误代码2-df49b60423903e095b80d9b4a92eb065,假设字典中SomeCustomException的值为2并且您使用MD5哈希。

这是我能够想到的最好的方法,以保持WebAPI和业务层分离并仍然自动化错误代码过程。