1.什么是中间件(Middleware)?
中间件是一种装配到应用管道以处理请求和响应的软件。
每个组件:
- 选择是否将请求传递到管道中下一个组件
- 可在调用管道中的下一个组件前后执行工作
请求委托(Request delegates)用于生成请求管道,处理每个HTTP请求。
请求委托使用Run
、Map
和Use
扩展方法进行配置
使用RunMap
和Use
扩展方法来配置请求委托。
1.并行中间件: 可将一个单独的请求委托并行指定为匿名方法
2.中间件组件: 或在可重用的类中对其进行定义。这些可重用的类和并行匿名方法
每个委托可以在下一个委托之前和之后执行操作。委托还可以决定不将请求传递给下一个委托,这称为请求管道的短路。短路通常是可取的,因为它避免了不必要的工作。
1.所有的请求处理都会在每个中间件组件调用next()方法之前触发。请求按照图中箭头的所示方向,依次穿过所有管道
2.当中间件处理请求并产生响应时,请求流程会在管道开始反向传递
可以看出请求委托的执行顺序是遵循上面的流程图的。
注意:
响应发送到客户端后,请勿调用next.Invoke。 响应开始之后,对HttpResponse的更改将抛出异常。 例如,设置响应头,状态代码等更改将会引发异常。在调用next之后写入响应体。
- 可能导致协议违规。 例如,写入超过content-length所述内容长度。
- 可能会破坏响应内容格式。 例如,将HTML页脚写入CSS文件。
HttpResponse.HasStarted是一个有用的提示,指示是否已发送响应头和/或正文已写入。
顺序
在Startup.Configure
方法中添加中间件的顺序定义了在请求上调用它们的顺序,以及响应的相反顺序。此排序对于安全性,性能和功能至关重要。
Startup.Configure
方法添加了以下中间件组件:
1.异常/错误处理
2.静态文件服务
3.身份认证
4.MVC
Use、Run和Map
你可以使用Use
、Run
和Map
配置HTTP管道。
Use
方法可以使管道短路(即可以不调用下一个请求委托)
Run
方法是一个约定,并且一些中间件可能暴露在管道末端运行的Run[Middleware]方法。
Map*
扩展用作分支管道的约定。映射根据给定的请求路径的匹配来分支请求流水线,如果请求路径以给定路径开始,则执行分支