ChatGPT解决这个技术问题 Extra ChatGPT

ASP.NET Core 中间件与过滤器

在阅读了 ASP.NET Core 中间件之后,我对什么时候应该使用过滤器以及什么时候应该使用中间件感到困惑,因为它们似乎可以实现相同的目标。什么时候应该使用中间件而不是过滤器?


A
Aage

频道 9 上有一个关于此的视频:ASP.NET Monsters #91: Middleware vs. Filters。总结视频:

https://i.stack.imgur.com/31siT.jpg


所以,如果我有逻辑我想在每个请求上运行(例如记录),只有其中一些与 MVC 相关,我会将它放在中间件中,然后让过滤器处理程序执行它可能需要的任何特定逻辑,然后重新抛出到中间件?
j
juunas

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

另一方面,MVC 过滤器仅针对到达 MVC 的请求运行。

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

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


M
Majid Parvin

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

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

来源和示例:thetechplatform.com


您的回答确实帮助我清楚地理解了一些事情。谢谢你。
附加的链接似乎已损坏且已死
刚刚替换了链接
D
Dina Bogdan

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

有什么相似之处:

传入的请求通过中间件组件,而对这些请求的传出响应在到达客户端时再次通过相同的中间件。一些过滤器(资源、操作和结果)也是双向的,其他过滤器(授权和异常)仅针对请求运行一次,页面过滤器(特定于 Razor 页面)运行三次。

中间件可以通过直接返回响应来短路请求,而不是执行整个中间件管道并且不将请求传递给后面的中间件。过滤器还可以通过直接返回响应来使过滤器管道短路。

中间件用于横切关注点(例如:日志记录、性能分析或异常处理)。过滤器也用于处理横切关注点。

有什么区别:

中间件可以针对所有请求运行,而过滤器仅针对到达 EndpointMiddleware 并从 API 控制器或 Razor 页面执行操作的请求运行。

过滤器可以访问 MVC 组件(例如:ModelState 或 IActionResults)。与过滤器相比,中间件的工作级别较低,并且独立于 MVC 和 Razor Pages,因此它不能使用任何这些相关组件。

过滤器旨在应用于请求的子集,而不是所有请求。例如,我们可以在单个控制器或单个 Razor 页面上应用过滤器。相比之下,中间件没有这种设计。

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

中间件是一个更笼统的概念,它对 HttpContext 等较低级别的抽象进行操作,因此可以应用于更广泛的领域。此外,我们应该意识到我们需要实现的功能没有特定于 MVC 的要求

过滤器可以使我们能够使用 MVC 结构,并且可以用于为某些 MVC 操作实现自定义和特定行为。它不像中间件那么通用。