导读:本期聚焦于小伙伴创作的《C# 中间件在ASP.NET Core中有什么作用?如何用它构建请求处理管道》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C# 中间件在ASP.NET Core中有什么作用?如何用它构建请求处理管道》有用,将其分享出去将是对创作者最好的鼓励。

ASP.NET Core的中间件是组成请求处理管道的核心单元,每个中间件都可以对进入应用的HTTP请求和离开应用的HTTP响应进行处理,多个中间件按照添加顺序串联起来,就形成了完整的请求处理流程。

中间件的核心作用

中间件在ASP.NET Core中主要承担以下几类职责:

  • 请求预处理:比如验证请求头信息、解析身份认证令牌、记录请求日志等,在请求到达业务控制器前完成前置校验。
  • 请求转发:将符合条件的请求传递给下一个中间件,或者直接将请求短路返回响应,不再执行后续逻辑。
  • 响应处理:对业务处理完成后返回的响应内容进行修改,比如添加统一的响应头、处理跨域配置、捕获全局异常等。
  • 管道构建:通过多个功能不同的中间件组合,形成覆盖认证、缓存、路由、业务处理等全环节的请求处理管道。

中间件的运行原理

每个中间件本质是一个委托,接收HttpContext对象和下一个中间件的引用作为参数。当请求进入管道时,会按照中间件添加的顺序依次执行,每个中间件可以选择调用下一个中间件,也可以直接返回响应终止流程。

中间件的执行流程可以用以下逻辑表示:

// 中间件委托的基本形式
public delegate Task RequestDelegate(HttpContext context);

// 单个中间件的简化逻辑
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
    // 请求进入当前中间件时的处理逻辑
    // 比如记录请求开始时间
    var startTime = DateTime.Now;
    
    // 调用下一个中间件,将请求传递下去
    await next(context);
    
    // 响应返回当前中间件时的处理逻辑
    // 比如记录请求耗时
    var elapsed = DateTime.Now - startTime;
    Console.WriteLine($"请求耗时:{elapsed.TotalMilliseconds}ms");
}

自定义中间件的方式

ASP.NET Core支持两种自定义中间件的方式,分别是基于约定的中间件类和内联中间件委托。

1. 基于约定的中间件类

这种方式适合逻辑复杂、可复用性高的中间件,需要定义包含InvokeAsync方法的类,构造函数可以注入依赖的服务。

// 自定义日志中间件
public class RequestLogMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestLogMiddleware> _logger;

    // 构造函数注入下一个中间件和日志服务
    public RequestLogMiddleware(RequestDelegate next, ILogger<RequestLogMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    // 必须定义InvokeAsync方法,参数是HttpContext
    public async Task InvokeAsync(HttpContext context)
    {
        // 请求处理前记录信息
        _logger.LogInformation($"收到请求:{context.Request.Method} {context.Request.Path}");
        
        // 传递请求到下一个中间件
        await _next(context);
        
        // 响应处理后记录信息
        _logger.LogInformation($"返回响应状态码:{context.Response.StatusCode}");
    }
}

// 扩展方法方便注册中间件
public static class RequestLogMiddlewareExtensions
{
    public static IApplicationBuilder UseRequestLog(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestLogMiddleware>();
    }
}

2. 内联中间件委托

这种方式适合逻辑简单、仅在特定场景使用的中间件,直接在Startup.csConfigure方法中通过Use方法添加。

// 在Configure方法中添加内联中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 内联中间件,处理所有请求,添加自定义响应头
    app.Use(async (context, next) =>
    {
        // 请求处理前添加响应头
        context.Response.Headers.Add("X-Custom-Header", "Middleware-Demo");
        
        // 调用下一个中间件
        await next();
        
        // 响应返回后可以添加额外逻辑
        // 比如如果响应状态是404,记录未找到路径
        if (context.Response.StatusCode == 404)
        {
            Console.WriteLine($"路径未找到:{context.Request.Path}");
        }
    });
}

构建请求处理管道

请求处理管道的构建是通过在Configure方法中按序添加中间件完成的,中间件的添加顺序决定了请求的处理顺序,常见的基础管道顺序如下:

添加顺序中间件作用说明
1异常处理中间件捕获后续中间件抛出的异常,返回统一错误响应,一般放在最前面保证能捕获所有异常
2HTTPS重定向中间件将HTTP请求重定向到HTTPS,保证请求安全性
3静态文件中间件处理静态资源请求(如js、css、图片),如果请求是静态资源直接返回,不再走后续逻辑
4路由中间件匹配请求路径到对应的控制器和Action,确定请求的业务处理端点
5认证授权中间件验证用户身份和权限,不符合要求的请求直接返回401或403
6业务中间件自定义的业务相关中间件,比如请求日志、接口限流等
7端点中间件执行匹配到的控制器Action逻辑,返回业务响应

以下是一个完整的管道构建示例:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 1. 异常处理中间件,放在最前面
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }
    
    // 2. HTTPS重定向
    app.UseHttpsRedirection();
    
    // 3. 静态文件处理
    app.UseStaticFiles();
    
    // 4. 路由
    app.UseRouting();
    
    // 5. 认证授权
    app.UseAuthentication();
    app.UseAuthorization();
    
    // 6. 自定义请求日志中间件
    app.UseRequestLog();
    
    // 7. 端点,匹配到业务处理
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

中间件使用注意事项

  • 中间件的添加顺序非常重要,比如异常处理中间件必须放在最前面,否则无法捕获后续中间件的异常;认证中间件必须放在路由中间件之后、端点中间件之前,才能正确校验请求权限。
  • 如果中间件不调用next委托,请求会被短路,后续的所有中间件都不会执行,比如认证失败直接返回响应的场景就可以使用短路逻辑。
  • 中间件的InvokeAsync方法中的逻辑尽量不要有长时间阻塞的操作,避免影响请求处理性能,耗时操作可以考虑异步处理或者放到后台任务中。
  • 依赖注入的服务在中间件中通过构造函数注入时,需要注意服务的生命周期,比如单例的中间件不能注入作用域级别的服务,否则会报生命周期不匹配的错误。
合理设计中间件的组合方式,可以让ASP.NET Core应用的请求处理流程更清晰、更易维护,同时也能将通用逻辑抽到中间件中,减少业务代码的重复。

ASP.NET_Core中间件Middleware请求处理管道C#修改时间:2026-06-22 08:19:10

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。