在 ASP.NET Core 中创建中间件的 4 种方式

前言

今天大姚带领大家一起来盘点一下在 ASP.NET Core 应用程序中添加和创建中间件的常见的四种方式。

中间件介绍

ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件,它们被安排在请求处理管道中,并按顺序执行。中间件的设计是为了使其在请求处理管道中能够以灵活和可扩展的方式处理 HTTP 请求和响应。

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道:

了解现有中间件的顺序,以及在哪里添加自定义中间件。 你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。

中间件用途

开发者通过在请求处理管道中添加不同的中间件(Middleware)组件,可以实现应用程序的认证和授权、日志记录、异常处理、静态文件处理、路由和端点映射、CORS(跨域资源共享)、会话管理、请求压缩、国际化和本地化、缓存等各种功能。

通过请求委托添加中间件

我们可以通过在 WebApplication 实例上调用 Use 方法,并提供一个带有两个参数的 lambda 方法来实现。第一个参数是 HttpContext,第二个参数是管道中的实际下一个请求委托。

ini 复制代码
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            app.Use(async (context, next) =>
            {
                // 在这里处理请求
                // ...

                await next.Invoke();

                // 在这里处理响应
                // ...
            });

            app.Run();

按约定添加中间件

ASP.NET Core中提供了许多内置中间件,例如静态文件中间件、路由、认证、授权中间件等。这些中间件通常已经预先定义好了,开发者只需按照约定调用相应的方法即可。

ini 复制代码
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            // 使用静态文件中间件
            app.UseStaticFiles();

            // 使用路由中间件
            app.UseRouting();

            // 使用认证中间件
            app.UseAuthentication();

            // 使用授权中间件
            app.UseAuthorization();

            app.Run();

创建自定义中间件类

创建自定义中间件类

首先我们创建一个自定义中间件类 RequestLoggingMiddleware,它将记录每个请求的详细信息。

csharp 复制代码
    public class RequestLoggingMiddleware
    {
        private readonly RequestDelegate _next;

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

        public async Task InvokeAsync(HttpContext context)
        {
            // 记录请求信息
            Console.WriteLine($"Request Method: {context.Request.Method}");
            Console.WriteLine($"Request Path: {context.Request.Path}");

            // 调用下一个中间件
            await _next(context);

            // 记录响应状态码
            Console.WriteLine($"Response Status Code: {context.Response.StatusCode}");
        }
    }

创建扩展方法

为了方便在应用程序中注册中间件,我们可以创建一个扩展方法。

arduino 复制代码
    public static class RequestLoggingMiddlewareExtensions
    {
        public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestLoggingMiddleware>();
        }
    }

在应用程序中使用自定义中间件

Program.cs 文件中,使用自定义中间件。

ini 复制代码
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            // 使用自定义中间件
            app.UseRequestLogging();

            app.Run();

添加基于工厂的中间件

IMiddlewareFactory 是 ASP.NET Core 中用于创建和管理中间件实例的接口。它提供了一种灵活的方式来控制中间件的创建和生命周期管理,特别是在需要复杂依赖注入或条件实例化的场景中。

创建自定义中间件工厂

实现 IMiddlewareFactory 接口的自定义工厂类。

csharp 复制代码
    public class CustomMiddlewareFactory(IServiceProvider serviceProvider) : IMiddlewareFactory
    {
        private readonly IServiceProvider _serviceProvider = serviceProvider;

        public IMiddleware? Create(Type middlewareType)
        {
            // 使用服务提供者创建中间件实例
            return _serviceProvider.GetService(middlewareType) as IMiddleware;
        }

        public void Release(IMiddleware middleware)
        {
            // 如果需要,可以在这里释放中间件实例(容器负责释放资源)
            (middleware as IDisposable)?.Dispose();
        }
    }

创建自定义中间件

实现 IMiddleware 接口的自定义中间件类。

arduino 复制代码
    public class CustomMiddleware : IMiddleware
    {
        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            Console.WriteLine("在这里处理请求.......");

            await next(context);

            Console.WriteLine("在这里处理响应.......");
        }
    }

注册中间件和工厂

Program.cs 文件中注册自定义中间件和工厂。

ini 复制代码
            var builder = WebApplication.CreateBuilder(args);

            // 注册中间件和工厂到依赖注入容器
            builder.Services.AddTransient<CustomMiddleware>();
            builder.Services.AddTransient<IMiddlewareFactory, CustomMiddlewareFactory>();

            var app = builder.Build();

            // 使用基于工厂的中间件
            app.UseMiddleware<CustomMiddleware>();
            app.Run();

最后总结

在ASP.NET Core中添加和创建中间件的方式有很多种,本文列举了四种常见的方式,具体取决于你的需求和偏好。每种方式都有其适用的场景,选择合适的方法可以使您的代码更加简洁和易于维护。

相关推荐
鱼樱前端36 分钟前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆1 小时前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
颜酱4 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
IT_陈寒5 小时前
SpringBoot自动配置坑了我一周,原来问题这么蠢!
前端·人工智能·后端
iOS开发上架哦6 小时前
Android代码混淆与iOS加固技术详解
后端·ios
Alan_6916 小时前
商品详情优化三板斧-拆分-多级缓存-GC调参
后端·缓存
Conan在掘金7 小时前
ArkTS 进阶之道(3):为哈禁解构声明?类型一眼可见 vs 推断链断裂
后端
晚安code7 小时前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
feng尘7 小时前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试
大陈AI7 小时前
Docker Compose 前后端部署踩坑实录:3 个坑让我的容器反复 Exit(1)
后端