如何在ASP.NET Core中正确实现ExceptionFilterAttribute

时间:2017-03-10 00:28:28

标签: exception-handling asp.net-core

是否有关于如何正确实施ExceptionFilterAttribute的文档?例如:

  • 设置context.Result时会发生什么?它会将该结果序列化为整体响应吗?它是否会停止应用任何其他过滤器?
  • 设置context.ExceptionHandled时会发生什么?这是否意味着"我已完成处理异常,请将响应发送给客户",或者是否意味着"我已从异常中恢复,继续处理请求&# 34;
  • 您何时在开始或结束时致电base.OnExceptionbase.OnExceptionAsync?当您的实现没有处理给定的异常时,您是否只调用它?

没有关于此的官方文档,并且它不是最明显的实现,所以有没有人有a)好文档 - 可能是博客文章,或b)正确的示例实现?

1 个答案:

答案 0 :(得分:1)

Documentation关于ASP.NET Core中的过滤器。

关于错误处理的

Documentation

  

异常过滤器处理控制器创建,模型绑定,操作过滤器或操作方法中发生的未处理异常。它们不会捕获资源过滤器,结果过滤器或MVC结果执行中发生的异常。+

     

要处理异常,请将ExceptionContext.ExceptionHandled属性设置为true或写入响应。这会阻止异常的传播。请注意,异常过滤器无法将异常转换为“成功”。只有一个Action过滤器可以做到这一点。

     

异常过滤器适用于捕获MVC操作中发生的异常,但它们不像错误处理中间件那样灵活。首选中间件用于一般情况,并仅在需要根据选择的MVC操作进行不同的错误处理时使用过滤器。

关于“它是否会停止应用任何其他过滤器?”

  • 如果您有未处理的异常,则停止进一步的管道执行,因为当前方法执行已停止)并且异常上升到堆栈,直到它被更高级别的catch块捕获。

但请记住,ExceptionFilterAttribute逻辑的最终实现仍在进行中。预计在下一个.NET Core MVC 1.1.2中会有一些变化。

我发现以下有用的解释是github问题(Exception Filters returns an empty body)

  

已确认MVC 5.2.3和ASP.NET Core 1.1.0中的IActionFilters行为相同。但是,IExceptionFilters的行为与w.r.t不同。设置Result但保留ExceptionHandled==false。应该围绕设置Resul t。

删除此特殊情况      

与ASP.NET Core 1.0.x相比,1.1.0行为也是一种回归。

     

关于ASP.NET Core的一致行为的长篇故事:

     
      
  • 用户可以通过设置Result来短路大多数IFilterMetadata实现。但是,仅在例如OnActionExecuting()可以短路,但OnActionExecuted()不能。
  •   
  • 要使IExceptionFilter实现短路(仅在出路时调用),用户必须设置ExceptionHandled == true。
  •   
  • 在所有IFilterMetadata实现中设置ExceptionHandled == true也可确保不会重新抛出操作中抛出的异常。在这种情况下使用重写的结果。
  •   
  • 在与MVC 5.2.3的一个小的故意偏离中,设置Exception == null的处理方式与设置ExceptionHandled == true相同。
  •