本文作者:小黑黑

Middleware中间件

小黑黑 6个月前 ( 10-08 ) 310 抢沙发
Middleware中间件摘要: 什么是管道中间件       ASP.NET Core体系结构具有中间件系统,中间件是处理请求和响应的代码片段。中间件彼...

什么是管道中间件

       ASP.NET Core体系结构具有中间件系统,中间件是处理请求和响应的代码片段。中间件彼此连接行程管道。传入的请求通过管道传递,每个中间件都有机会将它们传递给下一个中间件之间对他们做一些事情,传出的响应也以相反的顺序通过管道传递,也就是说,最先注册的中间件,请求将会被第一个处理,响应将会被最后一个处理。

request-delegate-pipeline.png

       通过使用中间件,我们可以做很多事情,比如说我们的静态资源文件,那么我们就可以不必让请求进入到MVC的路由里面,在比如说我们没有进行登录和授权,那么我们就可以直接中断请求,不在让请求传递下去。

配置管道

       通常,我们Startup类中的Configure中使用Use*来进行配置管道,如:app.UseStaticFiles()   配置静态资源管道,app.UseExceptionHandler()  配置异常处理管道

       每种使用Use*都会向管道中添加中间件。它们的添加顺序决定了请求遍历它们的顺序,也就是说,最先添加的中间件,将会第一个处理请求。也将会最后一个处理响应。

没有分支的基本管道

       使用Use来进行配置,Run()添加最终的一个中间件,如果前面的中间件都没有处理请求,则由最后一个中间件来进行处理。

FO%6N[GOQGGGZLRPS}Z1CI9.png

       这里,每个中间件被定义为匿名方法,它们也可以被定义为完整的类。非终端中间件接收两个参数,HttpContext和RequestDelegate。终端中间件只接收HttpContext,最后输出结果为:

@]Z7XM_`59QH_OVR6F)305N.png

短路中间件

       中间件不一定调用下一个中间件。例如:静态文件中间件可以处理请求,则不需要将请求传递给下面的中间件,它可以立即响应。此行为被称为短路中间件。比如:我们将上面的中间件B中的

await next()注释,那么请求将不会被传递到终端中间件中。那么打印的结果将不包含C。

分支管道

       这里可以使用Map和MapWhen方法完成。Map允许我们根据请求路径指定分支。MapWhen可以为我们提供更多的控制。我们可以在HttpContext上指定谓词以决定是否分支。

Map:

GV7N$DHIV9KR76@B{1AJ)NC.png

new PathString() 表示请求的路径前缀,第二个参数为配置分支管道的委托,如果我们请求的路径中不以/foo开头,那么我们将会得到

PN@DGQUX@E5(CWL1SA`9)Z3.png

当我们请求路径中以/foo开头时,我们将会得到

Y~L3[{6OJY8O(P8_6K)10LV.png

请注意:当我们使用Map时,我们需要在分支管道的配置终端中间件,请求不会达到最外端的终端中间件,也就是说:我们的请求最终不能到达 C中间件。

MapWhen

      MapWhen方法和Map方法类似,第一个参数为条件,也就是说当我们的请求Url满足我们所写的规则时,才会进入到此中间件

~ZS1F%K(P[6PW{YG(@24%TU.png

如上面所设置的规则为,请求参数 foo的值为123时才会进入到此中间件。

重新加入主分支,UseWhen

      我们可以使用UseWhen来创建一个重新加入主管道的分支,第一个参数接受条件,已决定是否将分支重新加入到离开它的主管道中。用法和MapWhen类似。

3LC99W4U{~Y_V(HM`[$VLB1.png

       当我们的url中参数foo不为123时,将不会执行 B中间件,仅当我们参数foo为123时,中间件B才会执行,使用UseWhen我们可以不再里面执行终端中间件,最终请求将会到达我们最外端的终端中间件。

TWVGX~W1%@@{2O_S$_MM9J7.png


分享到: 网站分享代码

发表评论

快捷回复:

评论列表 (暂无评论,310人围观)参与讨论

还没有评论,来说两句吧...