首页 > 编程语言 >了解 ASP.NET Core 中的中间件

了解 ASP.NET Core 中的中间件

时间:2024-12-24 16:44:52浏览次数:5  
标签:ASP 请求 app 中间件 身份验证 next context NET

 

在 .NET Core 中,中间件(Middleware) 是处理 HTTP 请求和响应的核心组件。它们被组织成一个请求处理管道,每个中间件都可以在请求到达最终处理程序之前或之后执行操作。中间件可以用于实现各种功能,如身份验证、路由、日志记录、异常处理、静态文件服务等。


什么是中间件?

中间件是 HTTP 请求管道中的一个处理单元,负责处理传入的 HTTP 请求和返回的 HTTP 响应。每个中间件都有以下职责:

  1. 处理请求:可以对请求进行预处理(如修改请求内容、验证身份等)。
  2. 决定是否继续传递请求:可以选择将请求传递给下一个中间件,或者直接返回响应(短路请求管道)。
  3. 处理响应:可以在响应返回给客户端之前进行后处理(如添加响应头、记录日志等)。

中间件的工作原理

中间件的工作原理可以概括为以下几个步骤:

  1. 请求进入管道
    •  当一个 HTTP 请求进入应用程序时,它首先通过一系列的中间件组件。
    •  每个中间件都有机会处理请求,并决定是否将请求传递给下一个中间件。
  2. 中间件的执行顺序
    •  中间件是按照添加的顺序依次执行的。
    •  例如,身份验证中间件通常应该在路由中间件之前执行,以确保在路由处理请求之前已经进行了身份验证。
  3. 中间件的组成
    •  每个中间件通常是一个 Func<requestdelegate, requestdelegate=""></requestdelegate,> 委托,或者是一个实现了 IMiddleware 接口的类。
    •  RequestDelegate 是一个表示处理 HTTP 请求的委托,它接收一个 HttpContext 对象并返回一个 Task
  4. 中间件的执行流程
    •  当请求进入中间件时,中间件可以选择:
      •  处理请求并直接返回响应(短路请求管道)。
      •  将请求传递给下一个中间件(调用 next(context))。
    •  如果中间件调用了 next(context),那么请求将继续传递到下一个中间件。
    •  当请求通过所有中间件后,最终的处理程序(如控制器)将处理请求并生成响应。
    •  响应会按照相反的顺序通过中间件管道返回给客户端。

常见的中间件及其工作原理

以下是一些常见的中间件及其工作原理:

1. 身份验证中间件(Authentication Middleware)

  •  作用:用于处理用户身份验证。
  •  工作原理
    •  在请求到达控制器之前,身份验证中间件会检查请求中是否包含有效的身份验证信息(如 JWT 令牌、Cookie 等)。
    •  如果身份验证成功,中间件会将用户信息存储在 HttpContext.User 中。
    •  如果身份验证失败,中间件可以重定向到登录页面或返回 401 未授权响应。

示例

public void Configure(IApplicationBuilder app)
{
    app.UseAuthentication(); // 启用身份验证
    app.UseAuthorization();  // 启用授权
}

2. 路由中间件(Routing Middleware)

  •  作用:用于将请求路由到相应的处理程序(如控制器)。
  •  工作原理
    •  路由中间件会解析请求的 URL 和 HTTP 方法,并根据配置的路由规则将请求映射到相应的处理程序。
    •  路由规则可以通过 UseRouting 和 UseEndpoints 配置。

示例

public void Configure(IApplicationBuilder app)
{
    app.UseRouting(); // 启用路由解析
    app.UseEndpoints(endpoints =>
                     {
                         endpoints.MapControllerRoute(
                             name: "default",
                             pattern: "{controller=Home}/{action=Index}/{id?}");
                     });
}

3. 静态文件中间件(Static Files Middleware)

  •  作用:用于提供静态文件(如 HTML、CSS、JavaScript 文件)。
  •  工作原理
    •  静态文件中间件会检查请求的 URL,如果请求的是静态文件(如 wwwroot 目录下的文件),则直接返回文件内容。
    •  如果请求的不是静态文件,则将请求传递给下一个中间件。

示例

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // 启用静态文件服务
}

4. 异常处理中间件(Exception Handling Middleware)

  •  作用:用于捕获和处理应用程序中的异常。
  •  工作原理
    •  异常处理中间件会捕获管道中抛出的异常,并根据配置返回友好的错误页面或 JSON 响应。
    •  通常用于开发环境和生产环境。

示例

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage(); // 开发环境:显示详细错误页面
    }
    else
    {
        app.UseExceptionHandler("/Home/Error"); // 生产环境:重定向到错误页面
    }
}

5. 日志记录中间件(Logging Middleware)

  •  作用:用于记录请求和响应的日志信息。
  •  工作原理
    •  日志记录中间件可以在请求进入和离开管道时记录日志。
    •  通常通过第三方库(如 Serilog)或内置的日志记录系统实现。

示例

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: {context.Request.Method} {context.Request.Path}");
        await _next(context);
        _logger.LogInformation($"Response: {context.Response.StatusCode}");
    }
}

自定义中间件

你可以创建自定义中间件来处理特定的需求。自定义中间件通常是一个类,它包含一个 Invoke 或 InvokeAsync 方法,该方法接收 HttpContext 和一个 RequestDelegate 参数。

示例:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext context)
    {
        // 在调用下一个中间件之前执行的操作
        await context.Response.WriteAsync("Custom Middleware: Before\n");

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

        // 在调用下一个中间件之后执行的操作
        await context.Response.WriteAsync("Custom Middleware: After\n");
    }
}

然后在 Startup.cs 中使用这个中间件:

public void Configure(IApplicationBuilder app)
{
    app.UseMiddleware<CustomMiddleware>();

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

总结

  •  中间件 是 .NET Core 中处理 HTTP 请求和响应的核心组件,它们被组织成一个管道。
  •  中间件的工作原理是:请求依次通过每个中间件,每个中间件可以选择处理请求、传递请求或短路请求管道。
  •  常见的中间件包括身份验证、路由、静态文件服务、异常处理和日志记录。
  •  你可以通过自定义中间件来实现特定的功能。

通过理解中间件的工作原理和常见应用场景,你可以更好地设计和优化 .NET Core 应用程序的请求处理流程。

 

标签:ASP,请求,app,中间件,身份验证,next,context,NET
From: https://www.cnblogs.com/liyongqiang-cc/p/18628001

相关文章

  • 在 .NET Core 中使用 ActionBlock 实现高效率的多步骤数据处理
    目录一、引言二、ActionBlock介绍什么是ActionBlock?ActionBlock的特点ActionBlock的使用场景ActionBlock的基本用法三、假设场景四、解决方案一、引言上一篇博客分享了使用Channel来实现针对大量数据的多线程异步处理,感谢大哥们在评论中提出的宝贵的问题和建议!本篇将分享......
  • Windows各个版本对.NET framework各版本的支持情况
    参考:https://mp.weixin.qq.com/s/-Je7dN_k5HyPZdyBuxoomgwindows7.NETFramework4.5是那个不需要KB3063858补丁就能在Windows7上运行的版本。让我澄清并详细说明:.NETFramework在Windows7上的兼容性.NETFramework4.0和4.5:.NETFramework4.0和4.5在Windows7上原生......
  • .NET Core 类型系统(Types System)底层原理浅谈
    C#类型系统C#是一种强类型语言。每个变量和常量都有一个类型,每个求值的表达式也是如此。每个方法声明都为每个输入参数和返回值指定名称、类型和种类(值、引用或输出)。.NET类库定义了内置数值类型和表示各种构造的复杂类型。其中包括文件系统、网络连接、对象的集合和数组以......
  • YOLO11改进-模块-引入空间自适应特征调制网络SAFMN(Spatial Adaptive Feature Modulat
            尽管基于深度学习的解决方案在图像超分辨率(SR)中取得了令人瞩目的重建性能,但这些模型通常较大且架构复杂,使其与许多具有计算和内存限制的低功耗设备不兼容。为了克服这些挑战,我们提出了一种用于高效SR设计的空间自适应特征调制(SAFM)机制。具体来说,SAFM层使用......
  • .NET Freamework 创建windows 服务
    使用.NETFreamework创建windows服务今天有需求需要新写一个windows服务,发现资料找不到了。顺着模板一点一点写,需要对照微软的资料。这里自己重新整理一份,由于不需要使用跨平台,所以我还是使用.NETFramework4.8下的windows服务。微软文档地址如下:如何:创建Windows服务-.......
  • (2-3-01)目标检测与分割:基于PointNet的目标检测与分割+基于Voxel-based的目标检测与分割
    2.3 目标检测与分割LiDAR目标检测与分割是智能驾驶和机器人领域中的重要任务之一,它涉及从激光雷达(LiDAR)扫描数据中提取和识别目标物体。在本节的内容中,将详细讲解常见的LiDAR目标检测与分割算法。2.3.1 基于PointNet的目标检测与分割PointNet算法的发展推动了智能驾驶......
  • docker+kubernetes
    Docker docker 可以在阿里云仓库拉取,需要配置daemon.json dockersearchjava 全文搜索java相关镜像dockerpulljava:8 不输入版本号拉去latest最新版本查询下载dockerimages 看镜像仓库有哪些镜像软件查看具体软件镜像  dockerrun-d-p91:80nginx:......
  • .NET 9 中的 多级缓存 HybridCache
    HybridCache是什么在.NET9中,Microsoft将HybridCache带入了框架体系。HybridCache是一种新的缓存模型,设计用于封装本地缓存和分布式缓存,使用者无需担心选择缓存类型,从而优化性能和维护效率。实际上,HybridCache基于IDistributedCache提供的接口和操作,但增加了一些其他......
  • 【深度学习语义分割】U型网络UNet和双边语义分割网络BiSeNet哪种在滑坡分割中更有优势
    【深度学习语义分割】U型网络UNet和双边语义分割网络BiSeNet哪种在滑坡分割中更有优势?为什么?你会如何选择?【深度学习语义分割】U型网络UNet和双边语义分割网络BiSeNet哪种在滑坡分割中更有优势?为什么?你会如何选择?文章目录【深度学习语义分割】U型网络UNet和双边语义分......
  • .NET 阻止系统睡眠/息屏
    本文介绍Windows系统设备下如何阻止系统睡眠/息屏,以及想看当前阻止睡眠/息屏的应用信息powercfg/requests查看活动列表在播放音乐时,我们会发现设置了系统电源管理-自动睡眠,计划不会生效,这个音频播放操作阻止了系统自动睡眠。但不会阻止息屏,所以Windows下一般屏幕关闭是不影响音......