asp.net核心中间件vs过滤器

Arv*_*and 65 asp.net-mvc asp.net-core

在阅读了asp.net核心middlware后,我很困惑何时应该使用过滤器,何时应该使用中间件,因为它们似乎达到了相同的目标.应该何时使用中间件而不是装配件?

Arv*_*and 60

在第9频道有一个关于这个的视频: ASP.NET Monsters#91:Middleware vs. Filters.总结视频:

请求的执行开始,我们有一个中间件,另一个middlerware,把它想象成"玩偶里面的俄罗斯娃娃",最终路由中间件开始,然后请求进入MVC管道. 在此输入图像描述 因此,如果您不需要MVC的上下文(假设您关注流和执行,比如响应头部一些预路由机制等),那么使用中间件.
但是,如果您需要MVC的上下文并且您想要针对操作进行操作,那么请使用过滤器.

  • .NET Core Web API(不是 MVC)中不能有过滤器吗? (7认同)

juu*_*nas 47

中间件在ASP.NET Core级别上运行,可以对应用程序中的每个请求执行操作.

另一方面,MVC过滤器仅针对来自MVC的请求运行.

因此,例如,如果我想强制所有请求必须通过HTTPS完成,我将不得不使用中间件.如果我做了一个MVC过滤器,那么用户仍然可以通过HTTP请求例如静态文件.

但另一方面,在MVC控制器中记录请求持续时间的东西绝对可以是动作过滤器.


Din*_*dan 22

过滤器管道在很多方面与中间件管道相似,但它们也有一些差异,在决定使用哪种方法时应考虑这些差异。

有什么相似之处:

  • 传入请求通过中间件组件,并且这些请求的传出响应在到达客户端时再次通过相同的中间件传递。一些过滤器(资源、操作和结果)也是双向的,其他过滤器(授权和例外)仅针对一个请求运行一次,而页面过滤器(特定于 Razor 页面)运行三次。
  • 中间件可以通过直接返回响应来短路请求,而不是执行整个中间件管道并且不将请求传递给后面的中间件。过滤器还可以通过直接返回响应来短路过滤器管道。
  • 中间件用于横切关注点(例如:日志记录、性能分析或异常处理)。过滤器还用于处理横切关注点。

有什么区别:

  • 中间件可以针对所有请求运行,而过滤器将仅针对到达EndpointMiddlewareAPI 控制器或 Razor 页面并执行操作的请求运行。
  • 过滤器可以访问 MVC 组件(例如:ModelStateIActionResults)。与过滤器相比,中间件的工作级别较低,并且独立于 MVC 和 Razor Pages,因此它不能使用任何这些相关组件。
  • 过滤器被设计为应用于请求的子集,而不是全部。例如,我们可以在单个控制器或单个 Razor 页面上应用过滤器。相比之下,中间件则没有这种设计。

因此,当试图弄清楚应该使用什么:过滤器或中间件时,答案应该来自上面的比较。作为一名 TL;DR:

  • 中间件是更通用的概念,它运行在较低级别的抽象上HttpContext,因此可以应用在更广泛的领域。另外我们应该意识到我们需要实现的功能没有 MVC 特定的要求
  • 过滤器使我们能够使用 MVC 构造,并可用于实现某些 MVC 操作的自定义和特定行为。它不像中间件那么通用。


Maj*_*vin 14

的执行middleware发生在 MVC 上下文在管道中可用之前。也就是说,例如,在 ActionFilter 的情况下,middleware无权访问ActionExecutingContextActionExecutedContext。您有权访问的是HttpContext,它将允许您对请求和响应执行操作。由于模型绑定尚未发生,因此使用中间件不适合运行验证功能或修改值。Middleware无论调用哪个控制器或操作,也将在每个请求上运行。

另一方面,filters除非您在启动时全局注册过滤器,否则只会在指定的操作和控制器上运行。由于您可以完全访问上下文,因此您还可以访问控制器和操作本身。

来源和示例:dotnetcultist.com