ASP.NET Core 中间件的配置方法可以分为以上三种,对应的Helper方法分别是:Run(), Use(), Map()。
Run(),使用Run调用中间件的时候,会直接返回一个响应,所以后续的中间件将不会被执行了。
Use(),它会对请求做一些工作或处理,例如添加一些请求的上下文数据,有时候甚至什么也不做,直接把请求交给下一个中间件。
Map(),它会把请求重新路由到其它的中间件路径上去。
实际中呢,Use()这个helper方法用的最多。
Run():
这是一个使用Run方法调用的中间件,Run方法会终止整个中间件管道,它应该返回某种类型的响应。
Use():
Use看起来和Run差不多,但是多了一个next参数。next可以用来调用请求管道中的下一个中间件。而当前的中间件也可以自己返回响应,这就忽略掉了next调用。
在next调用之前,我们可以写一些请求进来的逻辑,而在next调用之后,就相当于返回响应了,这时候也可以写一些逻辑。
在本例中,我们下面还使用了Run方法注册了另一个中间件。因为中间件会按照它们注册的顺序进行调用,所以在第一个Use方法里执行next.Invoke()的时候,就会执行下面Run所调用的中间件。
Map():
Map方法可以把请求路由到其它的中间件上面。
在这里,如果请求的路径以/jump结尾,那么它所对应的handler方法,也就是HereIAm方法的中间件就会被调用,并返回一个响应。
而如果请求的路径不是以/jump结尾,那么HereIAm方法里面的中间件就不会被调用。
中间件Class
上面的例子,我都是使用的inline写法的中间件。
而实际上,中间件通常是自成一个类。中间件的类需要类似这样:
自定义的中间件类需要由这几部分组成:
接受一个RequestDelegate类型的参数next的构造函数。
按约定,还需要定义一个叫做Invoke的方法。该方法里会包含主要的业务逻辑,并且它会被请求管道所执行。Invoke方法可以忽略里面的_next调用,并返回一个响应;也可以调用_next.Invoke()把请求发送到管道的下一站。