中间件是ASP.NET Core的核心组件 中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。 中间件由前逻辑、next()、后逻辑3部分组成,前逻辑为第一段要执行的逻辑代码、next为指向下一个中间件的调用、后逻辑为从下一个中间件执行返回所执行的逻辑代码。每个HTTP请求都要经历一系列中间件的处理,每个中间件对于请求进行特定的处理后,再转到下一个中间件,最终的业务逻辑代码执行完成后,响应的内容也会按照处理的相反顺序进行处理,然后形成HTTP响应报文返回给客户端。 中间件是一种装配到应用管道以处理请求和响应的软件。 每个中间件执行以下任务: 选择是否将请求传递到管道中的下一个组件。 可在管道中的下一个组件前后执行工作。
ASP.NET Core中有许多内置中间件可以直接使用。也可以在ASP.NET Core应用中根据需要创建自定义中间件。最重要的是,一个给定的ASP.NET Core中间件只专注一个目的:即完成一个职责。
在ASP.NET Core中执行顺序
在ASP.NET Core中,中间件可以访问到的HTTP请求和HTTP响应,所以可以用来:
通过生成一个HTTP响应来处理HTTP请求 处理并可以修改HTTP请求,然后将该HTTP请求传给管道上的下一个中间件 处理并可以修改HTTP响应,并将HTTP响应传递给管道上的下一个中间件或ASP.NET Core应用
ASP.NET Core 中间件的三个概念
Map、Use和Run。Map用来定义一个管道可以处理哪些请求,Use和Run用来定义管道,一个管道由若干个Use和一个Run组成,每个Use引入一个中间件,而Run是用来执行最终的核心应用逻辑。
ASP.NET Core中,使用Use和Run扩展方法来向请求管线中注册行内中间件。Run扩展方法允许我们添加终点中间件(即该中间件后面不会再有中间件了)。另外,Use扩展方法允许我们项请求管线中添加可以继续调用下一个中间件的中间件。
用Use将多个请求委托链接在一起。 next参数表示管道中的下一个委托。 可通过不调用next参数使管道短路。 Run 委托不会收到 next 参数。 第一个 Run 委托始终为终端,用于终止管道。 Run 是一种约定。 某些中间件组件可能会公开在管道末尾运行的 Run[Middleware] Map*扩展用作分支管道的约定。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("第一个中间件开始");
await next.Invoke();
await context.Response.WriteAsync("第一个中间件结束");
});
app.Run(async context =>
{
await context.Response.WriteAsync("第二个中间件开始");
await context.Response.WriteAsync("【dotNet疯狂之路】");
await context.Response.WriteAsync("第二个中间件结束");
});
app.Run();
> 第一个中间件开始
> 第二个中间件开始
> 【dotNet疯狂之路】
> 第二个中间件结束
> 第一个中间件结束
ASP.NET Core 常用内置中间件
异常/错误处理 当应用在开发环境中运行时: 开发人员异常页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。 数据库错误页中间件 (UseDatabaseErrorPage) 报告数据库运行时错误。
当应用在生产环境中运行时: 异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。 HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。
HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。 静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。 Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。 用于路由请求的路由中间件 (UseRouting)。 身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。 用于授权用户访问安全资源的授权中间件 (UseAuthorization)。 会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();//开发人员异常页中间件
app.UseDatabaseErrorPage();//数据库错误页中间件
}
else
{
app.UseExceptionHandler("/Error");//异常处理程序中间件
app.UseHsts();//HTTP 严格传输安全协议 (HSTS) 中间件
}
app.UseHttpsRedirection();//HTTPS 重定向中间件
app.UseStaticFiles();//静态文件中间件
app.UseCookiePolicy();// Cookie 策略中间件
app.UseRouting();//用于路由请求的路由中间件
app.UseAuthentication();//身份验证中间件
app.UseAuthorization();//用于授权用户访问安全资源的授权中间件
app.UseSession();//会话中间件
app.Run();