1

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

基本上已经有一个现有的 Web 应用程序在运行。我们正在为此开发一个移动应用程序。由于有现成的实现,我尽量重用现有的业务层代码,以便以后更容易维护。

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

例如

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

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

例如

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 错误代码中。

这是我能想到的解决问题的办法,但是我正在处理的代码库非常大,重构和实现这个解决方案的工作量非常大。

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

4

2 回答 2

2

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

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

于 2013-10-17T05:30:11.377 回答
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 和业务层解耦并仍然自动化错误代码过程的最佳方式。

于 2013-10-18T06:25:15.293 回答