当前位置: 首页 > article >正文

深入浅出:ASP.NET Core 中间件的使用与封装

ASP.NET Core 中,中间件(Middleware)是处理 HTTP 请求和响应的核心组件。中间件可以在请求到达最终处理前对请求进行处理,也可以在响应返回客户端之前修改响应。通过使用中间件,开发者能够灵活地扩展应用程序功能,处理认证、日志记录、跨域请求、错误处理等常见任务。

本文将详细介绍 ASP.NET Core 中间件的工作原理、如何使用内置中间件、如何封装自定义中间件,并提供实际的例子来帮助你掌握中间件的使用技巧。


1. 什么是中间件?

中间件是一个处理请求和响应的组件,它构成了 ASP.NET Core 应用程序的请求处理管道。在请求到达应用时,ASP.NET Core 会通过每个中间件对请求进行处理,然后最终返回响应。在管道中的每个中间件都可以:

  • 处理请求:例如,验证请求的有效性、记录日志、修改请求内容等。
  • 调用下一个中间件:中间件可以选择将请求传递给管道中的下一个中间件,或者直接终止请求处理(例如直接返回响应)。
  • 修改响应:在请求处理结束后,中间件还可以对响应进行修改。

中间件的执行顺序

ASP.NET Core 中间件的执行顺序是非常重要的。你配置中间件的顺序决定了请求和响应的处理流程。例如:

  • 静态文件中间件(如 UseStaticFiles)应该尽量放在管道的前面,以便尽早处理静态文件请求。
  • 身份验证中间件(如 UseAuthentication)通常应该在授权中间件(UseAuthorization)之前执行,以确保用户身份的验证。
  • 异常处理中间件(如 UseExceptionHandler)应该放在所有其他中间件的上面,以捕获并处理任何异常。

2. 创建和使用自定义中间件

2.1 创建自定义中间件

自定义中间件是你编写的、用于处理请求和响应的业务逻辑组件。你可以通过实现一个类,并在类中定义一个 InvokeAsyncInvoke 方法来创建中间件。

示例:记录请求处理时间的中间件

public class RequestTimingMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext context)
    {
        var startTime = DateTime.Now;  // 记录请求开始时间

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

        var endTime = DateTime.Now;    // 请求结束时间
        var elapsedTime = endTime - startTime;

        // 记录请求处理时间
        Console.WriteLine($"Request processing time: {elapsedTime.TotalMilliseconds} ms");

        // 在响应头中添加请求处理时间
        context.Response.Headers["X-Processing-Time-ms"] = elapsedTime.TotalMilliseconds.ToString();
    }
}

2.2 注册自定义中间件

将中间件类注册到请求管道中,在 Program.csStartup.cs 文件的 Configure 方法中进行配置。这样,当请求进入应用时,它会依次经过管道中的中间件。

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        var app = builder.Build();

        // 注册自定义中间件
        app.UseMiddleware<RequestTimingMiddleware>();

        // 配置请求管道
        app.MapGet("/", () => "Hello, World!");

        app.Run();
    }
}

在上述代码中,RequestTimingMiddleware 中间件会计算每个请求的处理时间,并将该时间添加到响应的头部中。


3. 如何封装和复用中间件

封装中间件是指将中间件的逻辑从应用代码中分离出来,使其能够在不同的应用或多个地方复用。封装好的中间件可以处理常见的任务,比如错误处理、日志记录等。

3.1 捕获异常的中间件

一个常见的封装中间件的场景是全局异常捕获。这种中间件会捕获应用中未处理的异常,记录异常信息,并返回统一的错误响应。

public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            // 调用管道中的下一个中间件
            await _next(context);
        }
        catch (Exception ex)
        {
            // 记录异常
            Console.WriteLine($"Exception caught: {ex.Message}");

            // 返回统一的错误响应
            context.Response.StatusCode = 500;  // 内部服务器错误
            await context.Response.WriteAsync("An unexpected error occurred.");
        }
    }
}

3.2 使用依赖注入(DI)封装中间件

中间件也可以使用依赖注入(DI)来注入应用程序中的服务。例如,你可能需要在中间件中使用日志记录服务来记录请求的详细信息。

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<LoggingMiddleware> _logger;

    public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        _logger.LogInformation("Request started at: " + DateTime.Now);

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

        _logger.LogInformation("Request completed at: " + DateTime.Now);
    }
}

注册 DI 服务并将中间件添加到管道中:

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // 配置服务
        builder.Services.AddLogging();

        var app = builder.Build();

        // 使用 LoggingMiddleware
        app.UseMiddleware<LoggingMiddleware>();

        // 配置请求管道
        app.MapGet("/", () => "Hello, World!");

        app.Run();
    }
}

在这个例子中,LoggingMiddleware 中间件通过依赖注入获取了日志记录器,并在处理请求时记录了请求的开始和结束时间。


4. 常见的内置中间件

ASP.NET Core 提供了许多常见的内置中间件,可以帮助开发者快速实现常见的功能。以下是一些常用的内置中间件及其配置方法:

4.1 静态文件中间件(UseStaticFiles

静态文件中间件用于提供静态文件(如 HTML、CSS、JavaScript、图片等)给客户端。

app.UseStaticFiles(); // 默认会提供 wwwroot 目录中的静态文件

4.2 身份验证中间件(UseAuthenticationUseAuthorization

身份验证和授权中间件用于处理用户身份验证和访问控制。

app.UseAuthentication();   // 启用身份验证
app.UseAuthorization();    // 启用授权

4.3 错误处理中间件(UseExceptionHandler

错误处理中间件捕获应用中的异常并执行自定义的错误处理逻辑。

app.UseExceptionHandler("/Home/Error");  // 捕获全局异常并重定向到指定的错误页面

4.4 跨源资源共享(CORS)中间件(UseCors

跨源资源共享(CORS)中间件用于允许不同源的客户端访问你的 API。

app.UseCors(policy => policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

5. 中间件的顺序

中间件的执行顺序决定了请求处理的方式。你必须在配置管道时确保中间件的顺序正确。例如,静态文件中间件通常应该排在最前面,以便它可以直接返回静态文件,避免进一步的请求处理。身份验证和授权通常应该在路由中间件之前执行。

app.UseExceptionHandler("/Home/Error"); // 错误处理应该排在最前
app.UseStaticFiles();                   // 静态文件处理
app.UseRouting();                       // 路由
app.UseAuthentication();                // 身份验证
app.UseAuthorization();                 // 授权
app.MapControllers();                   // 映射控制器

总结

ASP.NET Core 的中间件为我们提供了灵活且强大的机制来扩展和处理 HTTP 请求和响应。通过自定义中间件,封装常见功能以及合理配置中间件顺序,我们能够构建更加可维护、模块化

和高效的应用程序。无论是记录请求日志、处理异常,还是提供跨域支持,中间件都能帮助我们轻松实现。希望本文的示例和讲解能够帮助你更好地理解和使用 ASP.NET Core 中间件。


http://www.kler.cn/a/570204.html

相关文章:

  • 测试周期紧张?功能与非功能测试的 5 个平衡策略
  • Tailwind CSS 问题:npm error could not determine executable to run
  • 嵌入式C语言学习记录之-14~17day
  • 蓝桥杯 过年【算法赛】
  • vm+centos虚拟机
  • Kafka系列教程 - Kafka 可靠传输 -5
  • HTML在网页开发中的应用与重要性
  • 麒麟V10-SP2-x86_64架构系统下通过KVM创建虚拟机及配置虚机的NAT、Bridge两种网络模式全过程
  • 销售易CRM:用户体验与市场评价深度分析
  • 【网络安全】——二进制协议 vs 文本协议:从原理到实战的深度解析
  • 二叉树专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》
  • MySQL调优--12--分批插入/更新数据 ---案例2
  • java数据结构_Map和Set(一文理解哈希表)_9.3
  • 【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.1.3时间序列数据优化(Rollover + ILM策略)
  • 如何通过rust实现自己的web登录图片验证码
  • 【一文读懂】卷积神经网络(CNN)基础详解
  • AI浏览器BrowserUse:Docker运行环境准备(三)
  • 微信小程序自定义导航栏,胶囊菜单按钮高度适配问题
  • 23种设计模式之《中介者模式(Mediator)》在c#中的应用及理解
  • 反向代理模块j