广义上来讲:Tomcat、WebLogic、Redis、IIS都是中间件; 狭义上来讲,也就是基于.NET CORE技术本身来说,中间件指的是ASP.NET Core中的一个组件。 中间件是ASP.NET Core的核心组件,MVC框架、响应缓存,身份验证、Cors、Swagger等都是内置中间件。 中间件由前逻辑,next,后逻辑3部分组成,前逻辑为第一段要执行的逻辑代码,next为指向下一个中间件的调用,后逻辑为从一个中间件执行返回所执行的逻辑代码。 每个HTTP请求都要经历一系列中间件的处理,每个中间件对于请求进行特定的处理后,再转到下一个中间件,最终的业务逻辑代码执行完成后,响应的内容也回按照处理的相反顺序进行处理,然后形成HTTP响应报文返回给客户端。 中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。开发人员可以对组成管道的中间件按照需要进行自由组合。 中间件的三个概念 Map、Use和Run。Map用来定义一个管道可以处理哪些请求,Use和Run用来定义管道,一个管道由若干个Use和Run组成,每个Use引入一个中间件,而Run是用来执行最终的核心应用逻辑。 这里边需要注意几点:
- use本身是从上到下执行的,所以需要注意顺序,有的需要考虑先后
- run之后的,不会被执行
- 如果中间件的代码比较复杂,或者我们需要重复使用一个中间件的话,我们最好把中间件的代码放到一个单独的中间件类中
- 中间件类是要给普通的.net类,它不需要继承任何父类或者实现任何接口,但是这个类需要有一个构造方法,构造方法至少要有一个RequestDelegate类型的参数,这个参数用来指向下一个中间件。这个类还需要定义一个名字为Invoke或InvokeAsync的方法,方法至少有一个HttpContext类型的参数,方法的返回值必须是Task类型。中间件类的构造方法和Invoke(或InvokeAsync)方法还可以定义其他参数,其他参数的值会通过依赖关系注入自动赋值。
- 中间件可以处理所有请求,而Filter只能处理对控制器的请求;中间件运行再一个更底层,更抽象的界别,因此再中间件中无法处理MVC中间件特有的概念。
- 中间件和Filter可以完成很多相似的功能。比如:“未处理异常中间件”和“未处理异常Filter”;“请求限流中间件”和“请求限流Filter”。
- 优先选择使用中间件;但是如果这个组件只针对MVC或者需要调用一些MVC相关的类的时候,我们只能选择Filter。