本帖最后由 狗蛋 于 2023-7-7 18:40 编辑
中间件是一种 装配到应用管道以处理请求和响应的软件 。每个组件:
- 选择是否将请求传递到管道中的下一个组件。
- 可在管道中的下一个组件前后执行工作。
请求委托用于生成请求管道。请求委托处理每个HTTP请求。
使用RunMap和Use扩展方法来配置请求委托。可将一个单独的请求委托并行指定为匿名方法(称为并行中间件),或在可重用的类中对其进行定义。这些可重用的类和并行匿名方法即为中间件,也叫中间件组件。
请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。当中间件短路时,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。
ASP.NET Core 请求管道包含一系列请求委托,依次调用。下图演示了这一概念。沿黑色箭头执行。
每个委托均可在下一个委托前后执行操作:
var builder = webApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
用Use将多个请求委托链接在一起。next参数表示管道中的下一个委托。可通过不调用next参数使管道短路。
通常可在next委托前后执行操作,如以下示例所示:
var builder = webApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async(context,next)=>
//DoworkthatcanwritetotheResponse.
await next.Invoke();
//Do logging or other work that doesn't writetothe Response.
);
app.Run(async context =>{
await context.Response.WriteAsync("Hello from 2nd delegate!");
});
app.Run();
当委托不将请求传递给下一个委托时,它被称为“让请求管道短路”。通常需要短路,因为这样可以避免不必要的工作。
中间件执行顺序
下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道。你可以在典型应用中了解现有中间件的顺序,以及在哪里添加自定义中间件。你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。
上图中的 “终结点” 中间件为相应的应用类型(MVC或Razor Pages)执行筛选器管道。
向Program.cs文件中添加中间件组件的顺序定义了针对请求调用这些组件的顺序,以及响应的相反顺序。此顺序对于安全性、性能和功能至关重要。
|