中间件类

在ASP.NET Core中,中间件是一个组件,它处理HTTP请求和响应。

中间件可以用于执行诸如身份验证、授权、日志记录、请求修改等任务。

中间件类不需要继承任何父类或实现任何接口,但是这个中间件类需要有一个构造方法,构造方法至少要有一个RequestDelegate类型的参数,这个参数指向下一个中间件;方法这个类还需要定义一个名称为Invoke或InvokeAsync的方法,方法至少有一个HttpContext类型的参数,方法的返回值必须是Task类型。

中间件类的构造方法和Invoke(或InvokeAsync)方法还可以定义其他参数,其他参数的值会通过依赖注入自动赋值。

以下是如何定义和使用中间件类的步骤:

1、创建中间件类

using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;

public class MyCustomMiddleware
{
    private readonly RequestDelegate _next;

    public MyCustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 在请求处理管道中的下一个组件之前执行的代码
        // 例如:记录日志、身份验证等

        // 调用管道中的下一个组件
        await _next(context);

        // 在请求处理管道中的下一个组件之后执行的代码
        // 例如:日志记录、修改响应等
    }
}

2、注册中间件

在Startup.cs或程序的构建过程中,我们需要在中间件管道中注册这个中间件

using Microsoft.AspNetCore.Builder;

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        // 注册中间件
        app.UseMiddleware<MyCustomMiddleware>();

        // 其他中间件注册
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGet("/", async context =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        });
    }
}

使用中间件

(1)全局中间件:

在上面的示例代码中,Configure方法中使用app.UseMiddeware()注册中间件,它将被添加到请求处理管道中,并在整个应用中生效;

(2)条件中间件:

如果我们需要在特定条件下使用中间件,我们可以在InvokeAsync方法中添加逻辑来决定是否调用_nex(context);

public async Task InvokeAsync(HttpContext context)
{
    if (/* 条件 */)
    {
        // 执行特定逻辑
    }
    else
    {
        // 调用管道中的下一个组件
        await _next(context);
    }
}

(3)中间件顺序

中间件的注册顺序就是中间件的指向顺序;

(4)依赖注入

如果我们的中间件需要依赖注入服务,可以在构造函数中添加参数,并在Startup.cs中的ConfigureServices方法中注册这些服务;

public class MyCustomMiddleware
{
    private readonly MyService _myService;

    public MyCustomMiddleware(RequestDelegate next, MyService myService)
    {
        _next = next;
        _myService = myService;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 使用_myService执行操作
    }
}

然后在ConfigureServices方法中注册MyService:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<MyService>();
}

通过这种方法,我们可以定义和使用中间件来扩展asp.net core应用的功能。

posted @ 2024-12-13 16:44  青云Zeo  阅读(63)  评论(0)    收藏  举报