Web API 2中的ExceptionFilter与ExceptionLogger与ExceptionHandler

时间:2019-01-22 11:21:33

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

我正在阅读此article,似乎有三种不同的异常事件。

我想使用Serilog之类的日志记录框架来捕获异常。

我应该将日志记录代码放入ExceptionFilter,然后放入ExceptionLogger,然后放入ExceptionHandler吗?我认为他们都可以访问完整的异常堆栈。

另外,我还应该将日志记录代码放在Application_Error的{​​{1}}中吗?

2 个答案:

答案 0 :(得分:7)

显然,您需要记录所有未处理的异常以监视应用程序的总体运行状况。为此,使用 ExceptionHandler将是您的最佳选择

如果引发了未处理的异常,则它将由以下对象以相同的顺序接收:

  1. ExceptionLogger
  2. ExceptionFilter
  3. ExceptionHandler(如果未处理的话)

为了更好地理解它们之间的区别,我将解释它们的目的。


ExceptionLogger

解决方案,以查看Web API捕获的所有未处理的异常。甚至在您击中控制器的动作之前或在控制器已经返回动作结果响应之后,都可能引发异常(请记住,动作的返回值不会直接传递给浏览器,而是由请求/响应进一步处理管道)。

例如,在控制器的构造函数,路由,响应序列化等过程中可能会发生异常

可能会注册多个异常记录器,并且在发生异常情况时将全部调用它们。

请注意,异常记录器在异常过滤器之前被调用,将在异常过滤器中进行处理,因此如果记录这些异常记录器,则可能会得到很多不相关的信息。

  • 目的:查看所有未处理的异常(甚至在到达异常过滤器之前)

  • 范围:全局


ExceptionFilter

使用此代码处理预期的异常(例如,业务逻辑抛出的UnauthorizedException),并根据异常类型自定义响应。换句话说,使用它来处理异常(例如,如果异常为UnathorizedException,则将用户重定向到登录页面)。

第一个处理异常“ wins”的过滤器,这样,即使已经处理了异常(设置了响应对象),其他异常处理程序也不会被调用

  • 目的:处理(而非记录)异常
  • 范围:每个操作,每个控制器,全局

ExceptionHandler

这个可以并且应该用于记录未处理的异常。每个申请只能注册一个。它也可以用于向用户显示一般错误页面-“发生未知错误”。

  • 目的:记录并处理不可预测/意外的异常
  • 范围:全球

我建议看看这个article

答案 1 :(得分:0)

如果要记录异常,则必须将代码放入ExceptionHandlerApplication_Error中(相同)。 ExceptionFilter对错误进行分类。如果应用抛出异常,Application_Error会处理错误。

ExceptionFilter通过错误逻辑对错误进行分类和分类,ExceptionLogger通过错误日志逻辑记录错误发生的时间。

简而言之,您可以将代码放在Application_Error的{​​{1}}中