【发布时间】:2017-07-23 19:01:14
【问题描述】:
在阅读了 ASP.NET Core 中间件之后,我对何时应该使用过滤器以及何时应该使用中间件感到困惑,因为它们似乎可以实现相同的目标。 什么时候应该使用中间件而不是过滤器?
【问题讨论】:
在阅读了 ASP.NET Core 中间件之后,我对何时应该使用过滤器以及何时应该使用中间件感到困惑,因为它们似乎可以实现相同的目标。 什么时候应该使用中间件而不是过滤器?
【问题讨论】:
过滤器管道在许多方面类似于中间件管道,但它们也有一些差异,在决定使用哪种方法时应该考虑。
有什么相似之处:
有什么区别:
EndpointMiddleware 并从 API 控制器或 Razor 页面执行操作的请求运行。ModelState 或 IActionResults)。与过滤器相比,中间件的工作级别较低,并且独立于 MVC 和 Razor 页面,因此它不能使用任何这些相关组件。所以,当试图弄清楚应该使用什么:过滤器或中间件时,答案应该来自上面的比较。 作为 TL;DR:
HttpContext这样的低层抽象进行操作,因此可以应用到更广泛的领域。 我们还应该意识到,我们需要实现的功能没有特定于 MVC 的要求
【讨论】:
第 9 频道有一个关于此的视频:ASP.NET Monsters #91: Middleware vs. Filters。总结视频:
请求的执行开始,我们有一个中间件,另一个中间件,把它想象成“玩偶里面的俄罗斯玩偶”,最终路由中间件启动,然后请求进入 MVC 管道。
因此,如果您不需要 MVC 的上下文(假设您关心流程和执行,例如响应标头一些预路由机制等),那么请使用 中间件。
但是,如果您需要 MVC 的上下文并且想要针对操作进行操作,那么请使用 过滤器。
【讨论】:
middleware 的执行发生在 MVC 上下文在管道中可用之前。也就是说,在 ActionFilter 的情况下,middleware 无权访问 ActionExecutingContext 或 ActionExecutedContext。您可以访问的是HttpContext,它允许您对请求和响应执行操作。由于尚未发生模型绑定,因此使用中间件不适合运行验证函数或修改值。 Middleware 也将在每个请求上运行,无论调用哪个控制器或操作。
另一方面,filters 只会在指定的操作和控制器上运行,除非您在启动时全局注册过滤器。由于您可以完全访问上下文,因此您还可以访问控制器和操作本身。
来源和例子:dotnetcultist.com
【讨论】:
中间件在 ASP.NET Core 级别上运行,可以对进入应用程序的每个请求进行操作。
另一方面,MVC 过滤器仅针对到达 MVC 的请求运行。
例如,如果我想强制所有请求必须通过 HTTPS 完成,我将不得不为此使用中间件。如果我做了一个 MVC 过滤器,用户仍然可以请求例如HTTP 上的静态文件。
但另一方面,在 MVC 控制器中记录请求持续时间的东西绝对可能是一个动作过滤器。
【讨论】: