前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 ASP.NET Core 中创建中间件的 4 种方式

在 ASP.NET Core 中创建中间件的 4 种方式

作者头像
郑子铭
发布于 2025-05-01 15:03:25
发布于 2025-05-01 15:03:25
9400
代码可运行
举报
运行总次数:0
代码可运行

前言

今天大姚带领大家一起来盘点一下在 ASP.NET Core 应用程序中添加和创建中间件的常见的四种方式。

中间件介绍

ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件,它们被安排在请求处理管道中,并按顺序执行。中间件的设计是为了使其在请求处理管道中能够以灵活和可扩展的方式处理 HTTP 请求和响应。

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道:

了解现有中间件的顺序,以及在哪里添加自定义中间件。 你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。

中间件用途

开发者通过在请求处理管道中添加不同的中间件(Middleware)组件,可以实现应用程序的认证和授权、日志记录、异常处理、静态文件处理、路由和端点映射、CORS(跨域资源共享)、会话管理、请求压缩、国际化和本地化、缓存等各种功能。

通过请求委托添加中间件

我们可以通过在 WebApplication 实例上调用 Use 方法,并提供一个带有两个参数的 lambda 方法来实现。第一个参数是 HttpContext,第二个参数是管道中的实际下一个请求委托。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            app.Use(async (context, next) =>
            {
                // 在这里处理请求
                // ...

                await next.Invoke();

                // 在这里处理响应
                // ...
            });

            app.Run();

按约定添加中间件

ASP.NET Core中提供了许多内置中间件,例如静态文件中间件、路由、认证、授权中间件等。这些中间件通常已经预先定义好了,开发者只需按照约定调用相应的方法即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            // 使用静态文件中间件
            app.UseStaticFiles();

            // 使用路由中间件
            app.UseRouting();

            // 使用认证中间件
            app.UseAuthentication();

            // 使用授权中间件
            app.UseAuthorization();

            app.Run();

创建自定义中间件类

创建自定义中间件类

首先我们创建一个自定义中间件类 RequestLoggingMiddleware,它将记录每个请求的详细信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class RequestLoggingMiddleware
    {
        private readonly RequestDelegate _next;

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

        public async Task InvokeAsync(HttpContext context)
        {
            // 记录请求信息
            Console.WriteLine($"Request Method: {context.Request.Method}");
            Console.WriteLine($"Request Path: {context.Request.Path}");

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

            // 记录响应状态码
            Console.WriteLine($"Response Status Code: {context.Response.StatusCode}");
        }
    }

创建扩展方法

为了方便在应用程序中注册中间件,我们可以创建一个扩展方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static class RequestLoggingMiddlewareExtensions
    {
        public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestLoggingMiddleware>();
        }
    }

在应用程序中使用自定义中间件

Program.cs 文件中,使用自定义中间件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            // 使用自定义中间件
            app.UseRequestLogging();

            app.Run();

添加基于工厂的中间件

IMiddlewareFactory 是 ASP.NET Core 中用于创建和管理中间件实例的接口。它提供了一种灵活的方式来控制中间件的创建和生命周期管理,特别是在需要复杂依赖注入或条件实例化的场景中。

创建自定义中间件工厂

实现 IMiddlewareFactory 接口的自定义工厂类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class CustomMiddlewareFactory(IServiceProvider serviceProvider) : IMiddlewareFactory
    {
        private readonly IServiceProvider _serviceProvider = serviceProvider;

        public IMiddleware? Create(Type middlewareType)
        {
            // 使用服务提供者创建中间件实例
            return _serviceProvider.GetService(middlewareType) as IMiddleware;
        }

        public void Release(IMiddleware middleware)
        {
            // 如果需要,可以在这里释放中间件实例(容器负责释放资源)
            (middleware as IDisposable)?.Dispose();
        }
    }

创建自定义中间件

实现 IMiddleware 接口的自定义中间件类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class CustomMiddleware : IMiddleware
    {
        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            Console.WriteLine("在这里处理请求.......");

            await next(context);

            Console.WriteLine("在这里处理响应.......");
        }
    }

注册中间件和工厂

Program.cs 文件中注册自定义中间件和工厂。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            var builder = WebApplication.CreateBuilder(args);

            // 注册中间件和工厂到依赖注入容器
            builder.Services.AddTransient<CustomMiddleware>();
            builder.Services.AddTransient<IMiddlewareFactory, CustomMiddlewareFactory>();

            var app = builder.Build();

            // 使用基于工厂的中间件
            app.UseMiddleware<CustomMiddleware>();
            app.Run();

最后总结

在ASP.NET Core中添加和创建中间件的方式有很多种,本文列举了四种常见的方式,具体取决于你的需求和偏好。每种方式都有其适用的场景,选择合适的方法可以使您的代码更加简洁和易于维护。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core 的 WebApplication 类
ASP.NET Core 提供了 3 个主机类(Host)。这些类用于配置应用、管理生命周期和启动 Web 服务。
郑子铭
2025/06/11
830
ASP.NET Core 的 WebApplication 类
ASP.NET Core管道详解[4]: 中间件委托链
ASP.NET Core应用默认的请求处理管道是由注册的IServer对象和HostingApplication对象组成的,后者利用一个在创建时提供的RequestDelegate对象来处理IServer对象分发给它的请求。而RequestDelegate对象实际上是由所有的中间件按照注册顺序创建的。换句话说,这个RequestDelegate对象是对中间件委托链的体现。如果将RequestDelegate替换成原始的中间件,那么ASP.NET Core应用的请求处理管道体现为下图所示的形式。[本文节选自《ASP.NET Core 3框架揭秘》第13章, 更多关于ASP.NET Core的文章请点这里]
蒋金楠
2020/12/01
1K0
ASP.NET Core管道详解[4]: 中间件委托链
ASP.NET Core 6框架揭秘实例演示[24]:中间件的多种定义方式
ASP.NET Core的请求处理管道由一个服务器和一组中间件组成,位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应,针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func<RequestDelegate, RequestDelegate>委托,但是我们具有不同的定义和注册方式。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
7560
ASP.NET Core 6框架揭秘实例演示[24]:中间件的多种定义方式
asp.net core 系列之中间件进阶篇-编写自定义中间件(middleware)
中间件是被用到管道(pipeline)上来处理请求(request)和响应的(response)。
Vincent-yuan
2019/09/10
1.1K0
dotNET Core 3.X 请求处理管道和中间件的理解
理解 dotNET Core 中的管道模型,对我们学习 dotNET Core 有很大的好处,能让我们知其然,也知其所以然,这样在使用第三方组件或者自己写一些扩展时,可以避免入坑,或者说避免同样的问题多次入坑。
oec2003
2020/04/24
7600
dotNET Core 3.X 请求处理管道和中间件的理解
ASP.NET Core真实管道详解[1]:中间件是个什么东西?
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 《ASP.NET Core管道深度剖析[共4篇]》 中围绕着一个经过极度简化的模拟管道讲述了真实管道构建的方式以及处理HTTP请求的流程。在这个系列 中,我们会还原构建模拟管道时刻意舍弃和改写的部分,想读者朋友们呈现一个真是的HTTP请求处理管道。 ASP.NET Core 的请求处理管道由一个Server和一组有序排列的中间件构成,前者仅仅完成基本的请求监听、接收和响应的工作,请求接收之后和响应之前
蒋金楠
2018/01/15
8480
ASP.NET Core真实管道详解[1]:中间件是个什么东西?
.net 温故知新【17】:Asp.Net Core WebAPI 中间件
到这篇文章为止,关于.NET "温故知新"系列的基础知识就完结了,从这一系列的系统回顾和再学习,对于.NET core、ASP.NET CORE又有了一个新的认识。
SpringSun
2024/01/19
3190
.net 温故知新【17】:Asp.Net Core WebAPI  中间件
ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
作为《ASP.NET Core 3框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》提供了很多新的章节,同时对现有的内容进行大量的修改。虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料,这个系列会将这些演示实例单独提取出来并进行汇总。对于想学习ASP.NET Core的同学,如果你觉得没有必要“钻的这么深”,倒是可以看看。本篇提供的20个简单的演示实例基本涵盖了ASP.NET Core 6基本的编程模式,我们不仅会利用它们来演示针对控制台、API、MVC、gRPC应用的构建与编程,还会演示Dapr在.NET 6中的应用。除此之外,这20个实例还涵盖了针对依赖注入、配置选项、日志记录的应用。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
1.5K0
ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
精通ASP.NET Core中的中间件
中间件是ASP.NET Core的一个基本组成部分。它允许你灵活且模块化地处理请求和响应。中间件会在请求流经应用程序的请求管道时对请求进行处理,在响应返回时也会对响应进行处理。
郑子铭
2025/02/21
1690
精通ASP.NET Core中的中间件
.NET6 Minimal API的使用方式
随着.Net6的发布,微软也改进了对之前ASP.NET Core构建方式,使用了新的Minimal API模式。之前默认的方式是需要在Startup中注册IOC和中间件相关,但是在Minimal API模式下你只需要简单的写几行代码就可以构建一个ASP.NET Core的Web应用,真可谓非常的简单,加之配合c#的global using和Program的顶级声明方式,使得Minimal API变得更为简洁,不得不说.NET团队在.NET上近几年真是下了不少功夫,接下来我们就来大致介绍下这种极简的使用模式。
科控物联
2022/03/29
7750
ASP.NET Core 6框架揭秘实例演示[26]:跟踪应用接收的每一次请求
很多人可能对ASP.NET Core框架自身记录的诊断日志并不关心,其实这些日志对纠错排错和性能监控提供了很有用的信息。如果需要创建一个APM(Application Performance Management)系统来监控ASP.NET Core应用处理请求的性能及出现的异常,我们完全可以将HostingApplication对象记录的日志作为收集的原始数据。实际上,目前很多APM(如OpenTelemetry.NET 、Elastic APM和SkyWalking APM等)针对都是利用这种方式收集分布式跟踪日志的。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
6700
ASP.NET Core 6框架揭秘实例演示[26]:跟踪应用接收的每一次请求
ASP.NET Core 中的管道机制
在开始之前,我们需要明确的一个概念是,在 Web 程序中,用户的每次请求流程都是线性的,放在 ASP.NET Core 程序中,都会对应一个 请求管道(request pipeline),在这个请求管道中,我们可以动态配置各种业务逻辑对应的 中间件(middleware),从而达到服务端可以针对不同用户做出不同的请求响应。在 ASP.NET Core 中,管道式编程是一个核心且基础的概念,它的很多中间件都是通过 管道式 的方式来最终配置到请求管道中的,所以理解这里面的管道式编程对我们编写更加健壮的 DotNetCore 程序相当重要。
AI.NET 极客圈
2019/07/30
1.2K0
ASP.NET Core 中的管道机制
快速展示原型之Minimal API开发
Minimal API官网地址: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/minimal-apis/security?view=aspnetcore-7.0
明志德道
2023/10/21
5740
【ASP.NET Core 基础知识】--中间件--创建自定义中间件
自定义中间件为开发人员提供了更大的灵活性和控制权,使他们能够更好地定制和优化ASP.NET Core应用程序的请求处理流程,满足特定的业务和性能需求。
喵叔
2024/01/17
4370
ASP.NET Core 框架本质学习
https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html
Vincent-yuan
2019/09/04
2.1K0
ASP.NET Core 框架本质学习
ASP.NET Core 知识速递 - Day 11:Compression 中间件
Response Compression是 ASP.NET Core 提供的一种中间件,用于对 HTTP 响应内容进行压缩。它通过支持的压缩算法(如 Gzip 或 Brotli)压缩服务器发送给客户端的响应内容,从而加快网络传输速度,特别适合处理大段文本或数据。
郑子铭
2025/01/10
810
ASP.NET Core 知识速递 - Day 11:Compression 中间件
ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略
承载ASP.NET应用的服务器资源总是有限的,短时间内涌入过多的请求可能会瞬间耗尽可用资源并导致宕机。为了解决这个问题,我们需要在服务端设置一个阀门将并发处理的请求数量限制在一个可控的范围,即使会导致请求的延迟响应,在极端的情况会还不得不放弃一些请求。ASP.NET应用的流量限制是通过ConcurrencyLimiterMiddleware中间件实现的。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2023/07/10
3940
ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略
ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事
  本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道,从管道的配置、构建以及请求处理流程等方面做一下详细的研究。 一、概述   上文说到,请求是经过 Server监听=>处理成httpContext=>Application处理生成Response。 这个Application的类型RequestDelegate本质是 public delegate Task RequestDelegate (HttpContext context); ,即接收HttpContext并返回Task,
FlyLolo
2018/05/17
6110
ASP.NET Core应用基本编程模式[1]:管道式的请求处理
ASP.NET Core框架目前存在两个承载(Hosting)系统。ASP.NET Core最初提供了一个以IWebHostBuilder/IWebHost为核心的承载系统,其目的很单纯,就是通过下图所示的形式承载以服务器和中间件管道构建的Web应用。ASP.NET Core 3依然支持这样的应用承载方式,但是本系列不会涉及这种“过时”的承载方式。
蒋金楠
2020/11/11
8830
ASP.NET Core应用基本编程模式[1]:管道式的请求处理
使用 .NET Core 中的超时中间件提高 UI 性能
今天带来了 .NET Core 的新文章 Timeout 中间件,让我们了解一下,看看我们可以实时应用哪些地方。
郑子铭
2024/12/31
2440
使用 .NET Core 中的超时中间件提高 UI 性能
推荐阅读
相关推荐
ASP.NET Core 的 WebApplication 类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验