2017-03-10 51 views
1

有没有关于如何正确实现ExceptionFilterAttribute的文档?例如:如何在ASP.NET核心中正确实现ExceptionFilterAttribute

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

有没有这方面的官方文档,它不是实行最明显的事情,所以没有任何人有任何一)良好的文档 - 也许博客文章,或b)一个正确的样品实施?

回答

1

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

Documentation关于错误处理。

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

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

异常过滤器适用于捕获MVC操作中发生的异常,但它们不如错误处理中间件那么灵活。在一般情况下优先使用中间件,并且只在需要根据选择哪个MVC操作进行错误处理的地方使用过滤器。


关于“是否停止施加任何进一步的过滤器?”

  • 进一步流水线执行,如果您有未处理的异常,停止为当前的方法停止执行)和异常,直到它在一个较高的水平catch块赶上去堆栈。

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

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

已经证实在MVC 5.2.3和ASP.NET核心1.1.0 IActionFilters行为相同。但是,IExceptionFilters的行为与w.r.t不同。设置为Result,但保留ExceptionHandled==false。应该在设置Resul t时删除这个特殊情况。

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

长的故事有关ASP.NET核心一致的行为:

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