是否有关于如何正确实施ExceptionFilterAttribute
的文档?例如:
context.Result
时会发生什么?它会将该结果序列化为整体响应吗?它是否会停止应用任何其他过滤器?context.ExceptionHandled
时会发生什么?这是否意味着"我已完成处理异常,请将响应发送给客户",或者是否意味着"我已从异常中恢复,继续处理请求&# 34; base.OnException
或base.OnExceptionAsync
?当您的实现没有处理给定的异常时,您是否只调用它?没有关于此的官方文档,并且它不是最明显的实现,所以有没有人有a)好文档 - 可能是博客文章,或b)正确的示例实现?
答案 0 :(得分:1)
Documentation关于ASP.NET Core中的过滤器。
关于错误处理的异常过滤器处理控制器创建,模型绑定,操作过滤器或操作方法中发生的未处理异常。它们不会捕获资源过滤器,结果过滤器或MVC结果执行中发生的异常。+
要处理异常,请将ExceptionContext.ExceptionHandled属性设置为true或写入响应。这会阻止异常的传播。请注意,异常过滤器无法将异常转换为“成功”。只有一个Action过滤器可以做到这一点。
异常过滤器适用于捕获MVC操作中发生的异常,但它们不像错误处理中间件那样灵活。首选中间件用于一般情况,并仅在需要根据选择的MVC操作进行不同的错误处理时使用过滤器。
关于“它是否会停止应用任何其他过滤器?”:
但请记住,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相同。