在阅读了 ASP.NET Core 中间件之后,我对什么时候应该使用过滤器和什么时候应该使用中间件感到困惑,因为它们似乎达到了同样的目的。 什么时候应该使用中间件而不是过滤器?
中间件在 ASP.NET 核心级别上运行,可以处理进入应用程序的每一个请求。
另一方面,MVC 过滤器只运行来自 MVC 的请求。
例如,如果我想强制所有请求都必须通过 HTTPS 完成,我就必须使用一个中间件。如果我做了一个 MVC 过滤器,用户仍然可以通过 HTTP 请求静态文件。
但另一方面,在 MVC 控制器中记录请求持续时间的东西绝对可以是动作过滤器。
在9频道 NET 怪兽 # 91: 中间件 vs 过滤器有一个关于这个的视频。视频总结如下:
请求的执行开始了,我们有一个中间件,另一个中间件,把它想象成“娃娃里的俄罗斯娃娃”,最终路由中间件启动,然后请求进入 MVC 管道。 因此,如果您不需要 MVC 的上下文(假设您关心的是流和执行,比如响应头部的一些预路由机制等) ,那么使用 中间件。 但是,如果您需要 MVC 的上下文,并且希望对操作进行操作,那么可以使用 过滤器。
middleware的执行发生在 MVC 上下文在管道中变得可用之前。也就是说,在 ActionFilter 的情况下,例如,middleware不能访问 ActionExecutingContext或 ActionExecutedContext。您可以访问的是 HttpContext,它允许您对请求和响应执行操作。由于模型绑定尚未发生,因此使用中间件不适合运行验证函数或修改值。无论调用哪个控制器或操作,Middleware也将在每个请求上运行。
middleware
ActionExecutingContext
ActionExecutedContext
HttpContext
Middleware
另一方面,除非在启动时全局注册过滤器,否则 filters只能在指定的操作和控制器上运行。因为您可以完全访问上下文,所以还可以访问控制器和操作本身。
filters
来源和例子: Thetechplatform.com
过滤器管道在许多方面与中间件管道相似,但它们也有一些差异,在决定使用哪种方法时应该考虑这些差异。
有什么相似之处:
有什么不同:
EndpointMiddleware
ModelState
IActionResults
因此,当试图找出应该使用什么: 过滤器或中间件时,答案应该来自上面的比较。 作为 TL; DR: