[四] ASP.NET Core中间件

Posted 长不大的大灰狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[四] ASP.NET Core中间件相关的知识,希望对你有一定的参考价值。

1、中间件

在 ASP.NET Core 中,中间件组件可以同时访问传入请求和传出响应。 因此,中间件组件可以处理传入请求并将该请求,传递给管道中的下一个中间件以进行进一步处理。也就是中间件可以看成在请求到响应过程中实现某些功能的组件。例如:StaticFiles 中间件、日志记录中间件组件、身份验证中间件,授权中间件,MVC 中间件等。

2、请求(Request)处理管道

请求管道是由Startup.cs文件中的Configure()方法进行配置,它是应用程序启动的一个重要部分。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }

}
  • 目前代码中有 2 个中间件在管道中 :UseDeveloperExceptionPage()方法和Run()方法。
  • 如果存在异常并且环境是Development,UseDeveloperExceptionPage中间件会被调用,显示开发异常页面。Run()方法只能将一个信息传入Response对象,且Run()方法注册的中间件是终端中间件,即请求走到Run方法后就不会再继续往下执行了。

如果希望中间件能够调用管道中的下一个中间件,则使用Use()方法注册中间件,如下所示。

app.Use(async (context, next) =>
{
    await context.Response.WriteAsync("从第一个中间件中打印Hello World");
    await next();
});

app.Run(async (context) =>
{
    await context.Response.WriteAsync("从第二个中间件中打印Hello World");
});

3、请求处理管道的流程:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
                ILogger<Startup> logger)
{
    app.Use(async (context, next) =>
    {
        logger.LogInformation("MW1:传入请求");
        await next();
        logger.LogInformation("MW1:传出响应");
    });

    app.Use(async (context, next) =>
    {
        logger.LogInformation("MW2: 传入请求");
        await next();
        logger.LogInformation("MW2: 传出响应");
    });

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("MW3: 处理请求并生成响应");
        logger.LogInformation("MW3: 处理请求并生成响应");
    });
}

MW1:传入请求
MW2:传入请求
MW3:处理请求并生成响应
MW2:传出响应
MW1:传出响应

所有的请求都会在每个中间件组件调用next()方法之前触发。所有的响应都会在每个中间件组件调用next()方法之前触发。

以上是关于[四] ASP.NET Core中间件的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 空白模板搭建Mvc架构

(VIP-朝夕教育)2021-06-19 .NET高级班 56-ASP.NET Core 管道中间件详解

ASP.NET Core 中间件向控制器传递参数

ASP.NET Core 6.0对热重载的支持

理解ASP.NET Core

如何在 ASP.NET Core 中间件中直接将响应正文设置为文件流?