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

asp,net,core · 浏览次数 : 19

小编点评

本文介绍了在ASP.NET Core应用程序中添加和创建中间件的四种常见方式: 1. 按照约定添加中间件:ASP.NET Core 提供了许多内置中间件,如静态文件中间件、路由、认证和授权中间件等。开发者只需按照约定调用相应的方法即可。 2. 创建自定义中间件类:自定义中间件类需要实现 IMiddleware 接口,并在 InvokeAsync 方法中处理请求和响应。 3. 创建扩展方法:为了方便在应用程序中注册中间件,可以创建一个扩展方法,使注册过程更简洁。 4. 添加基于工厂的中间件:通过实现 IMiddlewareFactory 接口的自定义工厂类,可以更好地控制中间件的创建和生命周期管理。 总之,根据项目需求和团队习惯选择合适的中间件添加方式,可以提高代码的可维护性和扩展性。

正文

前言

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

中间件介绍

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

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

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

中间件用途

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

通过请求委托添加中间件

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

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

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

                await next.Invoke();

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

            app.Run();

按约定添加中间件

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

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

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

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

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

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

            app.Run();

创建自定义中间件类

创建自定义中间件类

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

    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}");
        }
    }

创建扩展方法

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

    public static class RequestLoggingMiddlewareExtensions
    {
        public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestLoggingMiddleware>();
        }
    }

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

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

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

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

            app.Run();

添加基于工厂的中间件

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

创建自定义中间件工厂

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

    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 接口的自定义中间件类。

    public class CustomMiddleware : IMiddleware
    {
        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            Console.WriteLine("在这里处理请求.......");

            await next(context);

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

注册中间件和工厂

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

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

参考文章

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪

与ASP.NET Core中创建中间件的几种方式相似的内容:

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

前言 今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式。 中间件介绍 ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件,它们被安排在请求处理管道中,并按顺序执行。中间件的设计是为了使其在请求处理管道中能够以灵活和可扩展的

.NET周刊【7月第1期 2024-07-07】

国内文章 学习.NET 8 MiniApis入门 https://www.cnblogs.com/hejiale010426/p/18280441 MiniApis是ASP.NET Core中的轻量级框架,用最少的代码和配置创建HTTP API。其特点包括简洁明了、性能卓越、灵活多变、易于学习使用,

使用 OpenTelemetry 构建 .NET 应用可观测性(4):ASP.NET Core 应用中集成 OTel

目录前言使用 elastic 构建可观测性平台在 ASP.NET Core 应用中集成 OTel SDK安装依赖基础配置Instrumentation 配置创建自定义 Span 和 Metric完整的代码演示kibana 中查看数据TracingMetricsTracing 和 Logs 的关联 前

如何在现有项目中使用`Masa MiniApi`?

首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFramework的MiniApi的包 创建Asp.NET Core 空的项目模板 项目名称MFMiniApi 其他信息看图,取消Https配置,也可以选择, 这就是

Asp .Net Core 系列:集成 CAP + RabbitMQ + MySQL(含幂等性)

简介 官网:https://cap.dotnetcore.xyz/ CAP 是什么? 是一个 EventBus,同时也是一个在微服务或者 SOA 系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。 什么是 EventBus? 事件总线是一种机制,它允许不同的组件彼

Asp .Net Core 系列:基于 T4 模板生成代码

目录简介组成部分分类Visual Studio 中使用T4模板创建T4模板文件2. 编写T4模板3. 转换模板中心控制Manager根据 MySQL 数据生成 实体 简介 T4模板,即Text Template Transformation Toolkit,是微软官方在Visual Studio中引

【ASP.NET Core】动态映射MVC路由

ASP.NET Core 中的几大功能模块(Razor Pages、MVC、SignalR/Blazor、Mini-API 等等)都以终结点(End Point)的方式公开。在HTTP管道上调用时,其扩展方法基本是以 Map 开头,如 MapControllers、MapBlazorHub。 对于

Asp-Net-Core开发笔记:使用ActionFilterAttribute实现非侵入式的参数校验

前言 在现代应用开发中,确保API的安全性和可靠性至关重要。 面向切面编程(AOP)通过将横切关注点(如验证、日志记录、异常处理)与核心业务逻辑分离,极大地提升了代码的模块化和可维护性。 在ASP.NET Core中,利用ActionFilterAttribute可以方便地实现AOP的理念,能够以简

安全机密管理:Asp.Net Core中的本地敏感数据保护技巧

前言 在我们开发过程中基本上不可或缺的用到一些敏感机密数据,比如SQL服务器的连接串或者是OAuth2的Secret等,这些敏感数据在代码中是不太安全的,我们不应该在源代码中存储密码和其他的敏感数据,一种推荐的方式是通过Asp.Net Core的机密管理器。 机密管理器 在 ASP.NET Core

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

目录什么是 AOP ?.Net Core 中 有哪些 AOP 框架?基于 Castle DynamicProxy 实现 AOPIOC中使用 Castle DynamicProxy实现事务管理实现用户自动填充 什么是 AOP ? AOP(Aspect-Oriented Programming,面向切面