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

时间:2017-03-03 15:29:46

标签: asp.net-mvc asp.net-core

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

3 个答案:

答案 0 :(得分:45)

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

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

答案 1 :(得分:39)

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

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

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

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

答案 2 :(得分:5)

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

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

来源和示例:dotnetcultist.com