aspx 使用什么中间件_ASP.NET Core中间件

本文详细介绍了ASP.NET Core中间件的概念,包括其定义、请求管道的工作原理、短路中间件、Map和MapWhen以及UseWhen的用法。通过实例展示了如何自定义中间件,并强调了中间件在处理请求和响应中的作用以及在管道中的执行顺序。
摘要由CSDN通过智能技术生成

中间件一词在软件开发和IT中被广泛使用,也许你对这词并不陌生,它不是一个特定描述性的词。那在asp.net core中间件是什么?今天我们就来看下asp.net core新引入的概念——中间件。今天的内容如下 :

  1. 中间件的定义

  2. 请求管道

    1)程序配置

    2)基本配置

    3)短路中间件

    4)Map和MapWhen

    5)UseWhen

  3. 自定义中间件

一.中间件的定义

什么是中间件?先来看下.net  core指南里的定义;

中间件是一种装配到应用管道以处理请求和响应的软件。每个组件:

  • 选择是否将请求传递到管道中的下一个组件。

  • 可在管道中的下一个组件前后执行工作。

短短这几个字就概括了中间件的定义,我们把这个定义解剖如下:

a.中间件是处理请求和响应的代码片段

b.中间件彼此连接以形成管道

c.传入的请求通过管道传递,每个中间件有机会在下一个中间件之前和之后执行操作

d.任何中间件都可以选择停止将请求传递给下一个中间件,从而自己处理请求

e.响应时以相反的顺序通过管道

可能还是有点抽象,我们来看.NET Core指南提供的 Web应用程序中间件执行的顺序。顺序非常重要,因此有必要了解每个请求委托在管道中的位置。

a4a3c437f429fb565a1a585eb6c07152.png

图1:HTTP管道

27c0169d32b4d37766865e2bb2840840.png

图2:ASP.NET Core请求处理

二.请求管道

1)asp.net core web应用程序是如何配置?

在asp.net core应用程序中,中间件的配置是在Startup类的Configure方法进行配置。按空模版创建asp.net core应用程序默认情况下Configure方法的默认代码如下:

e443c1f4ecf937167454a0f743be49bc.png

每种Use*方法都会在管道中添加中间件。添加顺序决定了请求遍历它们的顺序。因此,如果是开发环境传入的请求将首先遍历异常处理程序中间件,然后遍历路由,最终终结节点。

Use*在此示例中的方法实际上是封装后的方法,这样更容易使用,但这些封装方法背后都使用了Use或者Run。这两者都是向管道添加中间件,不同之处在于Run添加了终端中间件,即,在管道中最后的中间件。那我们来看Use和Run的用法。

2)基本管道

先看一个简单的例子,我们把Configure方法里的代码做个修改。修改后如下图:

f3c44fd34410dd5996f351247a2b3c78.png

这里为了方便每个中间都使用匿名方法,当然你可以定义为一个类(在文章末尾自定义中间件有介绍)。Use为非终端中间件,它使用了两个参数HttpContext(Http请求上下文)和next(调用下一个中间件的委托);Run为终端中间件,只能使用HttpContext。使用Use调用next(),但下一个中间件不存在,会返回404响应,可以在最后一个中间件不调用next()或者使用Run来代替。而使用多个Run中间件时,只会执行第一个中间件,后面的中间件不会被执行。我们运行上面代码输出结果如下 :

A (before)B (before)CB (after)A (after)

我们可以看到每个中间件都按照添加顺利进行执行,然后以相反的顺序返回响应。执行的顺序与图1一致。假设现在执行到中间件B时,中断执行后面的中间件,代码要怎么实现?

3)短路中间件

比如,执行完中间件B后不想传递给下一个中间件,即执行完中间件B后就返回响应,我们称为短路中间件。像常用的静态文件。

短路中间件实现很简单只要在相应中间件的next注释掉就可以。

我们把B中间件的next注释掉看看它的输出结果:

A (before)B (before)B (after)A (after)

如您所想,中间件C就没有被调用。

上面举的这些例子都有一个共同点按顺序执行,即:紧随中间件A的总是B,而紧随B的中间件始终是C。但在实际项目中我们会碰到一些需要特殊处理场景,比如:当我们访问A地址时不能执行中间件B,访问B地址时才执行中间件B,但不执行后面的中间件。这时我们需要引入分支管道,接下来我们来看分支管道的使用。

4)Map和MapWhen

当出现业务逻辑比较复杂时,我们需要定制化的中间件来处理HttpContext,就要考虑使用分支,即Map和MapWhen。而两者的区别在于MapWhen更灵活,Map基于请求路径指定分支,MapWhen是基于HttpContext来决定是否分支。我们先来看Map的用法。

4.1)Map用法

755761916820298eb03795626faf9354.png

直接看上图代码,Map的第一个参数是PathString代表请求的路径前缀。第二个参数是配置分支管道的委托(该a参数代表IApplicationBuilder的分支)。如果委托的路径以指定的路径前缀开头,则由委托定义的分支来处理该请求,而后面的中间件将不会继续执行。我们来看下这段代码执行结果,如下图:

0ec43a0db141683798f25944a99cf0c7.png

如上图所示,中间件B的分支不会重新加入主管道,所以不会调用中间件C。代码对应的管理可以用下图表示,这里缺少按原顺序返回的箭头。

5d28785c8e70140404bc56caef854e63.png

4.2)MapWhen使用

MapWhen它的特点灵活,看上去有点查询的意思。它是通过HttpContext来判定是否执行分支,能灵活处理各种逻辑。好,让我们来看下代码。

8be21104bc370b2a3c7d78da9f00130d.png

运行结果跟Map的一样,但MapWhen地址栏参数需带上?b=xxx,如:http://localhost:13963/?b=hello。从上面Map和MapWhen两个运行结果看,中间件C都没有执行,这时有没有办法让它们执行分支组件后重新回到主分支上继续执行中间件C?

5)UseWhen使用

UseWhen正好在MapWhen的基础上增加了执行分支之后会继续执行主支的中间件。看下代码。

0479c388f7e53bb332bdcf667d66405b.png

运行结果如下:

43770bde351c3952c995849762042516.png

当访问http://localhost:13963时中间件B没有被执行,它不符合/b的地址条件。而http://localhost:13963/b满足分支的条件即执行中间件B,执行完后重新回归到主支上来执行中间件C。反过来再看下代码,用红色圈起来的那行代码如果被注释掉结果将又是怎么样?大家可以试一试,结果就跟MapWhen一样。

到这里,中间件的基本用法就介绍到,还有一些中间件的使用大伙可以自己研究并分享。接下来咱聊下怎么自定义一个中间件。

三.自定义中间件

其实看完上面的基本知识,相信大家能够创建一个简单的中间件。为了本篇收尾,下面是简单的自定义中间件的方法。

首先创建一个类:CustomMiddlewareExtension,代码如下 :

68dac670d2ab9af681ab7c2df846963f.png

最后在Startup类的Configure方法里调用,代码如下:

a648297c5160d5bb8e2c7cc4d7175842.png

简单的自定义中间件就写好了,这里提个自定义中间件方法名的命名规则,最好 是以Use、Map开头后面跟方法名。

中间件可以完成各种事情,例如异常处理,HSTS和HTTPS重定向,静态文件,Cookie,身份验证,授权和会话,MVC和路由。当然,这些如何工作以及顺序都很重要。大家各自研究学习起来。

最后,祝学习愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值