ASP.NET Core 中间件(Middleware)

news/2025/2/4 14:28:15/文章来源:https://www.cnblogs.com/51net/p/18698190

ASP.NET Core 中,中间件是用来处理 HTTP 请求和响应管道的组件。中间件的核心思想是通过一个链式的管道处理请求和响应,每个中间件既可以处理请求或响应,也可以将其传递给下一个中间件。以下是详细解释:


1. 中间件是什么?

中间件是一个软件组件,用于在 HTTP 请求到达应用程序之前或响应发送到客户端之前进行处理。

  • 每个中间件都有机会对 HTTP 请求进行某种操作,比如:
    • 验证请求
    • 日志记录
    • 修改请求内容或响应内容
    • 终止请求处理
  • 中间件通过HttpContext 对象与请求和响应进行交互。

2. 如何使用中间件?

添加中间件

在 ASP.NET Core 中,中间件是通过Startup 类中的Configure 方法注册的。通常使用扩展方法UseXXX() 来将中间件添加到管道中。

示例代码:

public classStartup
{
    public void Configure(IApplicationBuilder app)
    {
        // 注册中间件
        app.Use(async (context, next) =>
        {
            // 处理请求逻辑
            Console.WriteLine("Middleware 1: Before next");

            // 调用下一个中间件
            await next.Invoke();

            // 处理响应逻辑
            Console.WriteLine("Middleware 1: After next");
        });

        app.Use(async (context, next) =>
        {
            Console.WriteLine("Middleware 2: Before next");
            await next.Invoke();
            Console.WriteLine("Middleware 2: After next");
        });

        // 终止中间件
        app.Run(async context =>
        {
            Console.WriteLine("Middleware 3: Handling request");
            await context.Response.WriteAsync("Hello, World!");
        });
    }
}

执行顺序:

  1. 请求进入时按注册顺序执行。
  2. 响应返回时按相反顺序执行。

创建自定义中间件

可以通过以下步骤创建一个自定义中间件:

  1. 定义一个中间件类,实现逻辑。
  2. 定义一个扩展方法方便注册。

示例:

public classCustomMiddleware
{
    privatereadonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext context)
    {
        // 前置逻辑
        Console.WriteLine("Custom Middleware: Before next");

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

        // 后置逻辑
        Console.WriteLine("Custom Middleware: After next");
    }
}

// 扩展方法
publicstaticclassCustomMiddlewareExtensions
{
    public static IApplicationBuilder UseCustomMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<CustomMiddleware>();
    }
}

// 注册中间件
publicclassStartup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseCustomMiddleware();
    }
}

3. 中间件解决什么问题?

中间件在 ASP.NET Core 中的主要作用是处理 HTTP 请求和响应管道,提供了一个高度模块化、灵活的机制。以下是中间件解决的一些核心问题:

  1. 管道化请求处理:

    • 通过链式调用将请求依次通过各个处理组件,使逻辑分层清晰。
    • 每个中间件只负责一个功能,符合单一职责原则。
  2. 灵活性与可扩展性:

    • 通过动态添加中间件,可以灵活地对请求进行处理,比如添加日志、认证、授权等。
  3. 性能优化:

    • 避免了传统 MVC 中的多层次处理模型,每个请求可以仅经过需要的中间件。
  4. 统一的 HTTP 管道:

    • ASP.NET Core 将所有处理(包括静态文件、MVC、SignalR 等)都通过中间件管道统一管理,减少了复杂性。

4. 中间件的应用场景

中间件在很多场景下都非常适用,以下是一些典型例子:

身份验证和授权

  • 使用中间件检查用户的身份认证状态(如 JWT、Cookies)。
  • 在管道中间件中根据请求的用户权限进行限制。

示例:

app.UseAuthentication();
app.UseAuthorization();

日志记录与监控

  • 使用中间件记录请求和响应日志。
  • 实现应用的性能监控和错误跟踪。

异常处理

  • 使用中间件捕获异常并统一返回用户友好的错误信息。
app.UseExceptionHandler("/Home/Error");
app.UseStatusCodePages();

静态文件服务

  • 提供对静态文件(如 HTML、CSS、JS 文件)的处理。
app.UseStaticFiles();

请求限流

  • 使用自定义中间件限制某段时间内请求的频率,防止流量攻击。

CORS(跨域资源共享)

  • 通过中间件处理跨域请求。
app.UseCors("AllowSpecificOrigins");

总结

  • 中间件是 ASP.NET Core HTTP 请求管道的核心组件,用于以模块化方式处理请求。
  • 它解决了请求处理的链式调用、功能分离、灵活扩展的问题。
  • 通过注册顺序的灵活性,可以根据需求实现不同的功能,如身份认证、日志记录、异常处理等。

理解并熟练运用中间件,可以帮助开发者构建高效、灵活的 Web 应用程序!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878542.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elf2部署官方yolov5模型

ELF2开发板(飞凌嵌入式)搭建深度学习环境部署(RKNN环境部署)本人主要介绍用于elf2的rk3588开发板的深度学习环境的搭建,和官方的方法不同,对于新手比较友好。零基础即可搭建,本人使用的是WSL2系统,当然使用虚拟机也是可以的,本人主要教学搭建yolov5模型转换为rknn的环…

ASP.NET Core 中授权过滤器(Authorization Filters)

在ASP.NET Core 中,授权过滤器(Authorization Filters)是用于在请求到达控制器操作方法之前,验证用户是否具有执行该操作的权限的一种机制。授权过滤器的主要作用是确保用户在访问控制器或操作方法时,已通过身份验证并且有足够的权限。 授权过滤器的工作原理 授权过滤器在…

Roo Code插件搭配DeepSeek快速创建项目示例

一、环境准备 1. 安装VSCode 访问 Visual Studio Code官网 下载并安装最新版本 2. 安装IDEA(运行Java项目) 访问IDEA官网下载并安装最新Community社区版二、Roo Code插件配置 1. 安装插件打开VSCode扩展市场(Ctrl+Shift+X) 搜索 "Roo Code" 安装官方插件(确认发…

电子书查找阅读教程

免责声明本文仅作学习交流,对于喜欢的作者,建议支持正版。软件下载Github发布地址:https://github.com/gedoor/legado/releases 完整教学:https://www.yuque.com/legado/wiki/xz直接浏览器打开选择最新版本下载即可书源导入喵工资订阅源:https://dy.miaogongzi.cc/直接浏览…

性能测试会被AI替代吗?

最近,deepseek火了,不少测试小伙伴忧心忡忡,担心测试岗位被替代 我个人观点是:经验类测试技术短期内还是很难被替代的。大家也可以问问deepseek或者其它ai,我们来看下deepseek的观点: 附文字版:性能测试是否会被AI替代,取决于具体的测试场景、技术发展阶段以及人类与…

Java Stream 流

目录概述StreamOptional开始管道中间管道(中间操作)终止管道(终端操作)常用的 Stream 操作方法匹配(Match)查找(Find)遍历(ForEach)过滤(Filter)映射(Map)扁平映射(FlatMap)截断(Limit)跳过(Skip)排序(Sorted)去重(Distinct)汇总(Collect)归约(Redu…

R9000P能连接wifi但无法上网

问题描述:前一晚还正常使用,第二天打开就不能上网,可以连接WiFi,切换过不同WiFi都一样,排除WiFi原因,此时浏览器显示找不到DNS,估计就是dns解析出了问题 解决办法:先去CMD下,输入ipconfig /flushdns 再控制面板->网络和Internet->找到下图,点击WLAN点击属性,双…

PCIe扫盲——TLP Header详解(二)

下面用几个具体的例子来讲解TLP Header的格式与作用。因为内容较多,所以分为多篇文章分别进行介绍。第一篇(即本文)介绍IO Request、Memory Request和Configuration Request。第二篇文章(即TLP Header详解三)介绍Completion ,第三篇文章(即TLP Header详解四)介绍Messag…

PCIe扫盲——TLP Header详解(一)

事务层包(TLP)的一般格式如下图所示:前面的文章介绍过,TLP Header为3DW或者4DW,Data Payload为1-1024DW,最后的TLP Digest(ECRC)是可选的,为1DW。 TLP Header在整个TLP的位置如下图所示,需要注意的是,TLP Header的格式和内容都会随着TLP的类型和路由方式的改变而改变…

龙哥量化:deepseek写技术指标,deepseek写选股公式,通达信deepseek写公式太牛了

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔) 2025的deepseek火出天际了,用来写技术指标,量化策略岂不是爽歪歪,哈哈 先说使用体验, 第一:写代码确实很强,…

这个记录一下,困扰了很久,usb网卡被隐藏。

这个问题困扰了很久,直到今天用了这个搜索。才发现问题,照做之后,usb网卡回来了。终于笔记本不用在连网线了,只连typtc扩展坞就可以了。没想到禁用之后,还被隐藏!!! 解决的链接。 https://blog.csdn.net/ljason1993/article/details/85884992