【ASP.NET CORE】 6. 中间件

ASP.NET Core 6.0 传统鉴权配置 为了保护我们的服务器资源,给被访问的资源或接口添加限制,让每一个请求不能随意访问 服务或 API 或 Action 方法。一般的过程是用户在客户端登录确认身份,向服务器发送登录信息从而验证这个人是否有登录权限。 在ASP.NET中,授权(Authorization)是确定当前用户是否被允许访问特定资源的过程。授权通常在身份验证之后发生,确保用户具有执行某些操作的权限。 阅读详情

本系列专栏基于杨中科老师的《ASP.NET Core技术内幕与项目实战》,本人记录梳理的学习笔记,有部分的增补和省略。更全面系统的讲解,请看杨老师的视频课:【.NET教程,.Net Core视频教程,杨中科主讲】。

一、中间件概念

中间件是ASP.NET Core 请求处理 pipeline(请求管道) 的核心基石,是框架的灵魂。ASP.NET Core 中几乎所有功能都是基于中间件实现的:MVC、静态文件、响应缓存、身份认证、CORS、路由、Swagger、异常处理等,全部都是内置中间件。

1. 广义与狭义中间件

  • 广义中间件:独立于业务逻辑、为应用提供通用服务的组件,比如 Tomcat、WebLogic、Redis、IIS、Nginx 等;
  • 狭义中间件:专指 ASP.NET Core 请求管道中处理 HTTP 请求 / 响应的组件。

2. 中间件的执行模型

每个标准中间件都由三部分构成:

  1. 前逻辑:请求进入时,最先执行的代码(处理请求、解析参数、校验等);
  2. next 委托:调用下一个中间件,将请求传递下去;
  3. 后逻辑:后续中间件执行完毕后,回溯执行的代码(处理响应、记录日志、修改返回值等)。

整个流程:HTTP 请求 → 中间件 1(前逻辑)→ 中间件 2(前逻辑)→ ... → 核心业务逻辑 → ... → 中间件 2(后逻辑)→ 中间件 1(后逻辑)→ HTTP 响应返回客户端。

3. 中间件管道模型

中间件按照注册顺序串联成一个管道,请求和响应在管道中顺序进入、逆序返回。开发人员可以自由增删、排序、自定义中间件,实现高度灵活的请求处理。

4. 三大核心配置方法

ASP.NET Core 提供三个关键方法配置中间件管道:

(1)Run

  •  终止型中间件,没有 next,执行完后直接返回响应;
  • 作为管道的终点,执行最终业务逻辑。 

(2)Use 

  • 串联型中间件,可以调用 next,将请求传递给下一个中间件;
  • 用于编写自定义处理逻辑。

 (3)Map / MapWhen 

  • 分支型方法,根据请求路径 / 条件拆分管道;
  • 满足条件则进入分支管道,不满足则继续主管道。

注意:Use 串联、Run 终止、Map 分支。

二、自定义中间件

中间件代码简单时可以用匿名方法,复杂 / 复用场景必须封装为独立中间件类。

1. 中间件类规范

中间件类是普通 C# 类,无需继承 / 实现接口,但必须满足:

  1. 构造方法:必须包含 RequestDelegate next 参数(指向下一个中间件);
  2. 执行方法:必须名为 Invoke 或 InvokeAsync;
  3. 方法参数:必须包含 HttpContext(当前请求上下文);
  4. 返回值:必须是 Task(支持异步)。

注意:构造方法和 Invoke 中的其他参数,会自动从依赖注入(DI) 中获取。

2. 示例

校验密码 + 自动解析请求 JSON 并存入上下文,供后续使用。

/// <summary>
/// 请求校验与JSON解析中间件
/// </summary>
public class CheckAndParsingMiddleware
{
    private readonly RequestDelegate _next;

    // 构造函数:注入下一个中间件委托
    public CheckAndParsingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // 核心执行方法(异步)
    public async Task InvokeAsync(HttpContext context)
    {
        // 前逻辑:校验密码
        string pwd = context.Request.Query["password"];
        if (pwd != "123")
        {
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            return;
        }

        // 前逻辑:如果是JSON请求,自动解析并存入 Context.Items
        if (context.Request.HasJsonContentType())
        {
            using var reader = new StreamReader(context.Request.Body);
            string jsonBody = await reader.ReadToEndAsync();
            // 这里可替换为 System.Text.Json 解析
            dynamic? jsonObj = System.Text.Json.JsonSerializer.Deserialize<dynamic>(jsonBody);
            context.Items["BodyJson"] = jsonObj;
        }

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

        // 后逻辑:可在这里统一处理响应(本案例无需后处理)
    }
}

3. 注册与使用中间件

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// 分支管道:仅 /test 路径生效
app.Map("/test", appBuilder =>
{
    // 注册自定义中间件
    appBuilder.UseMiddleware<CheckAndParsingMiddleware>();
    
    // 最终执行逻辑
    appBuilder.Run(async ctx =>
    {
        ctx.Response.ContentType = "text/plain";
        dynamic? jsonObj = ctx.Items["BodyJson"];
        
        if (jsonObj == null)
        {
            await ctx.Response.WriteAsync("未传递JSON数据");
            return;
        }

        int i = jsonObj.i;
        int j = jsonObj.j;
        await ctx.Response.WriteAsync($"{i} + {j} = {i + j}");
    });
});

app.Run();

测试方式:POST 请求 http://localhost:5000/test?password=123 Body 传递 {"i":10,"j":20}返回:10 + 20 = 30

三、实战案例 1:自定义迷你 Web API 中间件

模仿ASP.NET Core MVC,手写极简版 Web API 管道,理解框架底层原理。(代码见杨老师github)

管道设计

3 个中间件串联

  1. MyStaticFilesMiddleware:静态文件中间件 → 处理 wwwroot 静态资源
  2. MyWebAPIMiddleware:API 处理中间件 → 匹配路由、执行业务逻辑
  3. NotFoundMiddleware:404 中间件 → 所有请求未处理时返回未找到

核心思路

  • 静态文件中间件优先,找到文件则直接返回,终止管道;
  • 否则进入 API 中间件,匹配路径则处理请求;
  • 都不匹配则进入 404 中间件。

四、实战案例 2:Markdown 转 HTML 中间件

访问 .md 文件,自动在服务端转为 HTML 返回。

功能说明

  1. 请求 /doc/readme.md;
  2. 中间件读取服务器对应的 md 文件;
  3. 使用 Markdig 库将 Markdown 转为 HTML;
  4. 直接返回网页,无需前端渲染。

部分代码

public async Task InvokeAsync(HttpContext context)
{
    if (context.Request.Path.Value.EndsWith(".md"))
    {
        string mdPath = Path.Combine(webRootPath, context.Request.Path.Value.TrimStart('/'));
        if (File.Exists(mdPath))
        {
            string mdContent = await File.ReadAllTextAsync(mdPath);
            string html = Markdig.Markdown.ToHtml(mdContent);
            
            context.Response.ContentType = "text/html;charset=utf-8";
            await context.Response.WriteAsync(html);
            return;
        }
    }

    await _next(context);
}

五、中间件 Middleware vs 过滤器 Filter

对比项中间件 Middleware过滤器 Filter
作用范围全局,处理所有请求仅处理控制器 / Action 请求
执行阶段最外层管道,早于 MVC依赖 MVC 管道,属于 MVC 生命周期
依赖环境无依赖,最底层强依赖 MVC、Controller、Action 等对象
使用场景日志、认证、跨域、缓存、静态文件权限校验、参数验证、Action 拦截
控制粒度粗粒度,全局通用细粒度,可精确到 Action / 方法

区别总结

  1. 中间件是全局的,不管是不是 MVC 请求都会经过;
  2. Filter 是 MVC 专属的,只能拦截控制器动作;
  3. 中间件运行在更底层,无法使用 MVC 相关对象(如 Controller、ModelState、IActionResult);
  4. Filter 可以轻松获取Action 参数、返回值、控制器实例,中间件做不到。

选择建议

  • 优先使用中间件:通用功能、全局处理、不依赖 MVC;
  • 必须用 Filter:需要操作 MVC 相关对象、仅针对 API / 控制器生效。

总结

  1. 中间件是 ASP.NET Core 请求管道的基本单元;执行模型:前逻辑 → next → 后逻辑,请求顺序进,响应逆序回;三大方法:Use 串联、Run 终止、Map 分支。
  2. 自定义中间件:依赖 RequestDelegate + InvokeAsync。
  3. Middleware 全局通用,Filter MVC 专用,按需选择。
定制.NET 6.0的Middleware中间件 大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。 本章是《定制ASP NET 6.0框架系列文章》的第8篇。在本文中,我们将学习中间件,以及如何使用它进一步定制应用程序。我们将快速学习中间件的基础知识,然后探讨如何使用它做的一些特殊事情。 本文涵盖的主题包括: 中间件简介 编写自定义中间件 中间件的潜力 如何使用中间件 ... 阅读详情

相关推荐

ASP.NET Core 6中会话管理的陷阱和解决方案

在这个过程中,我们需要将用户的邮箱地址存储在会话中,以便后续OTP验证时使用。然而,开发者发现虽然没有报错,但当程序执行到设置会话的语句时,程序直接跳转到了登录页面,而没有继续执行到显示OTP验证页面的逻辑。本文将通过一个实际案例,探讨在ASP.NET Core 6中设置和获取会话信息时可能遇到的常见问题及其解决方案。在ASP.NET Core 6中,了解配置的变化以及中间件的使用顺序是解决此类问题的关键。经过分析,发现问题的根本原因在于ASP.NET Core 6中配置会话管理的方式发生了变化。

m0_74337424的博客 85

AspNetCore中的中间件详解【超详细】

虽然中间件的本质是一个Func middleware 对象,中间件的类型可分为两种,下面自定义实现以及记录请求IP地址的中间件弱类型中间件(1) 定义Ip中间件//调用下一个请求中间件 await requestDelegate . Invoke(context);} }(2)增加Use的拓展方法。

contact97的博客 3121

深入理解ASP.NET Core开发平台与工具

本文为《Pro ASP.NET Core 6》一书的读后感与总结。作者Adam Freeman详细介绍了ASP.NET Core的基础知识、应用程序的创建、以及高级特性。文章通过作者对开发框架的直接体验和建议,为读者提供了从准备开发环境到创建和运行ASP.NET Core应用的详细指导。同时,作者也坦诚地说明了本书未涵盖的内容,并提供了如何联系作者的途径。

weixin_33239721的博客 880

.net core 中间件

每个中间件都会处理请求,并将请求传递给下一个中间件,直到达到最后一个中间件,最后一个中间件将生成HTTP响应并将其返回给客户端。每个中间件既可以在请求传递给下一个中间件之前进行处理,也可以在请求传递给下一个中间件之后进行处理,这取决于中间件的实现。中间件是管道中的组件,用于处理请求和响应。总结起来,管道是一个抽象的概念,表示请求和响应经过的处理流程,而中间件是管道中的组件,用于处理请求和响应以实现特定的功能。以上只是一些常见的中间件示例,你可以根据应用程序的需求选择合适的中间件来处理不同的功能和行为。

标准都是留给不爱的人,爱的本质是自由意志的沉沦 1728

【STM32篇】DRV8425驱动步进电机

【STM32篇】在上篇文章中使用了HR4988实现了步进电机的驱动,在实际运用过程,4988驱动步进电机会存在电机噪音太大的现象。本次将向各位友友介绍一个驱动简单且非常静音的一款步进电机驱动IC。

we_long的博客 3069

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 403

ASP.NET core十个优秀的第三方中间件,你都用过吗?

微软在发布.NET Core推出了新特性中间件,在之后的版本中中间件继续发扬光大,不但出现很很多自带的中间件,还有很多第三方优秀的中间件,本文介绍十个优秀的第三方中间件,希望对你的项目开发有一定的帮助。1、AutoMapper: 这是一个用于在不同类型之间进行对象映射的库。它允许你使用简单的配置将一个对象映射到另一个对象,而无需手动复制对象的属性。2、Swashbuckle: 这是一个生成...

zls365365的博客 921

一条时间轴上的商品供给:商品供给域事件全景、八大子域事件清单与事件契约规范的工程推演

本文以虚构连锁零售企业“青禾鲜市”为例,用事件风暴重新梳理商品供给域:先剖析同词异义、状态模糊、隐式依赖与被动兜底四类冲突,再以时间轴、八条子域泳道与关键事件铺出全景地图,确立一个事件只有一个户口;随后为总店商品、门店商品、价格、库存、质量、标签、变更通知与操作日志列出聚合、事件、命令与策略,并统一命名、信封结构、版本与幂等规范。程序体检把初稿14个问题清零,仿真显示按聚合版本号更新可售视图可将误判从两位数百分比降到0.019%。文末给出四轮工作坊节奏与新品引入、全国调价、批次召回走查剧本。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 5万+

【ASP.NET Core 基础知识】--中间件--什么是中间件

在软件开发中,中间件是连接两个不同应用程序或软件组件的软件层。它位于两个系统或组件之间,充当通信、数据传递或功能交互的桥梁。中间件的主要目标是简化系统集成和提供一致的接口,使得不同组件能够有效地协同工作。在ASP.NET Core中,中间件是一种特定类型的组件,用于处理HTTP请求和响应。ASP.NET Core中间件在请求管道中按照顺序执行,每个中间件执行特定的任务或操作。这些中间件可以包括预处理请求、进行身份验证、记录日志、路由请求等功能。

喵叔 3280

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1430

第十七章:载板成本结构分析

本文分析了ABF和BT载板的成本结构,其中ABF载板材料成本占比50%(主要来自ABF薄膜),制造成本35%,利润15%;BT载板材料成本45%,制造成本40%。ABF薄膜价格预计将从2023年的80-90美元/panel上涨至2026年的120-150美元。良率每提升1%可降低成本约5%,产能利用率每提高10%可降本3-5%。通过设计优化(如减少层数)、工艺改进(提升良率)和供应链优化(材料国产化)可有效降低成本。预计2024-2028年AI用ABF载板成本将上涨10-15%,而手机用BT载板涨幅约5%。

Open 316

ASP.NET Core 中间件

中间件是一种装配到 ASP.NET Core 应用程序请求处理管道中的软件组件,用于处理 HTTP 请求和响应。

Warbin的博客 1924

uni-app - 解决 H5 微信公众号授权登录后,无法回退到 “上一页“ 的问题(微信登录后如何返回到触发它的那一页?无法通过 uni.navigateBack() 返回到前一页的问题?)详细教程

uniappH5微信登录重定向后无法返回到原来进入前的页面了,uni-appH5微信浏览器中授权微信登录后,无法正常回退问题,uniappH5微信登录后怎么返回上一页,uniapp公众号登陆后使用uni.navigateBack()回不去上一页,uniapp微信登录成功后返回页面后一直自动刷新页面,uniapph5授权成功后如何返回上一页,uniappH5微信登录后怎么返回到触发它的那一页去,公众号h5在授权后如何跳转回到刚进入时的页面,微信公众号H5网页返回上一页疑问,解决微信H5静默授

🏆 前端领域优质创作者 7715

ASP.NET Core 6 Clean Architecture性能优化:中间件、缓存与查询优化技巧

ASP.NET Core 6 Clean Architecture作为一款高效的Web API解决方案模板,在实际开发中需要针对性能进行多维度优化。本文将从中间件精简、缓存策略实施和数据库查询优化三个核心方向,为开发者提供实用的性能提升技巧,帮助你构建响应更快、资源利用率更高的应用程序。 ## 一、中间件优化:精简管道提升请求处理效率 中间件是ASP.NET Core处理请求的核心组件,合理精

gitblog_00924的博客 918

C#身份验证黑科技:用量子级加密与多维防御矩阵构建坚不可摧的用户管理系统!

某金融系统因身份验证漏洞导致200万用户数据泄露,量子级防御可将攻击面缩小99.99%。

墨夶的博客 353

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ASP.NET Core 6.0鉴权授权中间件 - Cookie方案

文章目录ASP.NET Core中鉴权授权中间件的使用使用Cookie的解决方案 ASP.NET Core中鉴权授权中间件的使用 鉴权(Authentication): 身份验证, 就是看用户有没有登录, 相当于确定客户端的身份 授权(Authorize): 查看当前身份是否有权限访问 使用Cookie的解决方案 // HomeController 表示此Action需要授权访问 [Authorize] public IActionResult Privacy() { return Vie

sosososolong的博客 2582

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Asp.Net Core6 WebSocket绑定

一、Asp.Net Core6 WebSocket绑定 使用中间件绑定WebSocket app.UseWebSockets(); app.Map("/upload/common", (con) => { con.UseWebSockets();//启用webscoket con.Use(async (ctx, next) => { Receiver _receive = new Receiver(ctx

天马3798 3890

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验

本篇提供的20个简单的演示实例基本涵盖了ASP.NET Core 6基本的编程模式,我们不仅会利用它们来演示针对控制台、API、MVC、gRPC应用的构建与编程,还会演示Dapr在.NET 6中的应用。除此之外,这20个实例还涵盖了针对依赖注入、配置选项、日志记录的应用。[本篇节选自《ASP.NET Core 6框架揭秘》第一章][101]利用命令行创建.NET程序(源代...

dotNET跨平台 2193

ASP.NET Core中间件处理请求管线(翻译)

本片文章将通过一个例子讨论请求处理管线。请阅读先前关于应用中间件的文章。

极客神殿 302

如何在 ASP.NET Core 6 中使用 HTTP 日志记录

ASP.NET Core 中包含的 HTTP 日志记录中间件允许您记录请求和响应数据,包括标头、正文和通用属性。我们将在本文的后续部分中使用该项目来处理 HTTP 日志记录。ASP.NET Core 6 中的 HTTP 日志记录中间件可用于记录 ASP.NET 6 应用程序中的请求和响应。请注意,使用 HTTP 日志记录可能会损害应用程序的性能,尤其是在记录请求和响应主体时。实际上ASP.NET Core默认开启了HTTP日志记录功能,下面是创建项目时Startup类的Configure方法的默认代码。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 941

.net core .net6 Form Cookie Login 认证

.net core , Form(表单) Cookie 的最简登录

曲滨_銘龘鶽 1115

在 ASP.NET Core 6/NET 8.0 如何添加 Startup.cs

使用ASP.NET Core 6.0项目,您将找不到Startup.cs文件。默认情况下,此文件将被删除,并且是将注册依赖项和中间件放到了Program.cs中。但是,如果您是Startup.cs的粉丝或将项目升级到ASP.NET Core 6.0,你可能仍想要使用Startup.cs文件。因此,在这篇文章中,让我们将了解如何在ASP.NET Core 6项目中添加Startup.cs

学习之路,创业之光 2996

ASP.NET Core 6.0 自定义指南(一)

ASP.NET Core 是微软提供的最强大的 Web 框架,它充满了使它更强大和有用的隐藏功能。不应该让你的应用程序去匹配框架;你的框架应该能够完成你的应用程序真正需要的功能。通过这本书,你将学习如何找到可以旋转以获得框架最大化的隐藏螺丝。使用 ASP.NET Core 开发的开发者将能够通过这本关于自定义 ASP.NET Core 的实用指南来运用他们的知识。本书提供了一种动手实践的方法,以及与其相关的实现方法和方法论,这将使你迅速投入工作并变得高效。本书是默认 ASP.NET Core 行为的紧凑集合

龙哥盟 563

玩转ASP.NET Core 6.0框架-序言

ASP.NET Core是微软提供的强大的web框架,它有很多潜在的强大而有用的功能。本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来,让您能够按需定制ASP NET Core框架。本专栏提供了一种具体的操作和实现方法,可以让你在短时间尽可能地提高效率。架构概览接下来,我们将介绍ASP.NET Core的基础架构及其组件。这专栏讨论了架构的几乎所有组成部分。下图显示...

dotNET跨平台 2335

ASP.NET Core 系列总结

ASP.NET Core》 系列文章基于 .NET 3.1 和 .NET 6,主要是系统总结自己日常工作和学习中的知识点,之前是自己在 OneNote 上自己写,作为学习、总结笔记,逐渐放出来也供大家参考,希望大家都能够对 ASP.NET Core 框架有一个清晰的认知。最近在重看自己以前的技术文章,算是对旧知识点的复习,同时也将一些博客内容进行迁移,先迁移完已有的内容,后续会基于.NET 9 持续更新新的知识点,系统化地将 .NET 体系的知识点学明白、讲明白。

weixin_37648525的博客 769
上一篇: 【ASP.NET CORE】 5. 面向切面编程
下一篇: 【ASP.NET CORE】 7. Identity标识框架
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值