使用ASP.net核心处理基本控制器中的异常(API控制器)

Mic*_*k R 1 c# asp.net-mvc asp.net-core asp.net-core-webapi

我们当前的许多控制器看起来像这样:

[HttpPost]
public List<Foo> Post([FromBody]Bar model)
{
    if (model == null)
    {
        throw new ArgumentNullException();
    }

    try
    {
        // business logic
    }
    catch (Exception ex)
    {
        // logging
    }

    return dto;
}
Run Code Online (Sandbox Code Playgroud)

虽然这里重复了很多代码.我想要做的是实现一个基本的控制器来处理异常,所以我可以返回一个标准化的响应与类似领域Payload,Success,Error,等.

在.net核心之前,这可以通过提供覆盖来实现,OnException但这似乎不适用于.net核心api控制器.当我的控制器主体出现问题时,如何合并此异常逻辑以返回自定义响应?

我想这样,作为一个起点:

[HttpPost]
public StandardFoo Post([FromBody]Bar model)
{
    if (model == null)
    {
        throw new ArgumentNullException();
    }

    // business logic

    return new StandardFoo(){Payload: dto};
}
Run Code Online (Sandbox Code Playgroud)

如果模型验证抛出异常或business logic冒泡到某个逻辑,该逻辑返回StandardFoo带有包含异常详细信息的属性的new .

Set*_*Set 5

如果不久,您不应该捕获并处理控制器中的异常.


相反,您需要在代码中分离正常流和错误流,然后分别处理错误流.指示正常流程不可能的主要方法之一是提高.NET异常(并使用它).但:

  • 控制器操作应该只知道正常流量.没有try-catch逻辑等等.
  • 用于输入验证使用ActionFilter.您可能拥有所有控制器的全局过滤器或定义特定的每个操作.请参阅文档中的过滤器部分 ASP.NET Core还允许进行模型验证.

  • 在控制器操作执行期间,您应该尽快引发异常并停止进一步的管道执行.是的,可以在任何级别(动作级别,服务/业务层,DA层等)上引发异常.

如何处理引发的异常呢?

  • 由ASP.NET Core错误处理方法(如ExceptionHandler或Exception Filters)提供的使用,它允许分析异常并相应地生成适当/不同的响应.在示例中查看ASP.NET Core问题中的相关SO 错误处理.文档中还有错误处理部分.