【ASP.NET Core 基础知识】--中间件--创建自定义中间件

这篇具有很好参考价值的文章主要介绍了【ASP.NET Core 基础知识】--中间件--创建自定义中间件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么需要自定义中间件

自定义中间件在ASP.NET Core中的应用主要有以下几个原因:

  1. 满足特定需求: 默认情况下,ASP.NET Core提供了许多内置的中间件来处理常见的任务,如身份验证、授权、静态文件服务等。然而,某些项目可能有特定的需求,需要定制化的处理流程,这时就需要创建自定义中间件以满足项目的特殊要求。
  2. 增加业务逻辑: 自定义中间件允许开发人员向请求处理流程中添加业务逻辑。这对于执行与应用程序的核心功能相关的任务非常有用,例如日志记录、性能监控、请求转换等。通过自定义中间件,开发人员可以灵活地将业务逻辑集成到请求处理管道中。
  3. 解耦和模块化: 自定义中间件有助于将应用程序的不同部分解耦,使代码更具模块化和可维护性。每个中间件可以专注于特定的任务,这样代码的组织结构更清晰,便于理解和维护。
  4. 性能优化: 自定义中间件可以用于执行性能优化任务,例如缓存、压缩、请求重定向等。通过在请求处理流程中插入自定义中间件,可以更好地控制和优化应用程序的性能。
  5. 适应特定场景: 不同的应用场景可能需要不同类型的中间件。通过创建自定义中间件,开发人员可以根据应用的特定需求,灵活地调整和配置中间件,以适应不同的使用场景。

自定义中间件为开发人员提供了更大的灵活性和控制权,使他们能够更好地定制和优化ASP.NET Core应用程序的请求处理流程,满足特定的业务和性能需求。

二、创建自定义中间件的基本步骤

创建自定义中间件涉及以下基本步骤:

  1. 创建一个类: 创建一个类来实现你的中间件。这个类通常需要包含一个构造函数以及一个名为InvokeInvokeAsync等的方法,用于处理请求。
    public class CustomMiddleware
    {
        private readonly RequestDelegate _next;
    
        public CustomMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task InvokeAsync(HttpContext context)
        {
            // 中间件逻辑处理
            await _next(context);
        }
    }
    
  2. 添加中间件的基本结构: 在中间件类中,你需要编写逻辑来处理请求。可以在Invoke方法中执行你的自定义逻辑,然后通过_next字段调用下一个中间件。
  3. 注册中间件:Startup.cs文件的Configure方法中,使用UseMiddlewareUse方法将中间件添加到请求处理管道中。确保注册中间件的顺序正确,因为中间件的执行顺序很重要。
    public void Configure(IApplicationBuilder app)
    {
        // 其他中间件
        app.UseMiddleware<CustomMiddleware>();
        // 或者使用 app.Use<CustomMiddleware>();
        // 其他中间件
    }
    
  4. 中间件的执行流程: 确保理解中间件的执行流程。当请求到达时,每个中间件按照注册的顺序依次执行,然后请求通过管道传递给下一个中间件,直到最终的处理程序。
  5. 配置中间件: 如果中间件需要配置选项,可以通过构造函数参数或其他方式将配置传递给中间件。这允许你在Startup.cs中配置中间件的行为。
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // 其他中间件
        app.UseMiddleware<CustomMiddleware>(/* configuration options */);
        // 其他中间件
    }
    
  6. 测试中间件: 最后,确保测试你的中间件。创建单元测试和集成测试,验证中间件在不同场景下的正确性和可靠性。

三、中间件的参数和上下文对象

3.1 解释中间件的参数

ASP.NET Core 中间件的 InvokeInvokeAsync 方法通常接受一个 HttpContext 参数,该参数提供了关于当前请求和响应的信息。此外,中间件的构造函数也可以接受其他服务或选项,以实现更多的定制和灵活性。

  1. HttpContext 参数:
    • HttpContext 包含了有关当前请求和响应的信息,如请求路径、请求方法、请求头、查询参数、响应状态等。
    • 可以使用 HttpContext 提供的方法来访问请求和响应的内容,以及执行与中间件逻辑相关的操作。
    public async Task InvokeAsync(HttpContext context)
    {
        // 使用 context 处理请求和响应
    }
    
  2. 构造函数参数:
    • 构造函数可以接受其他服务作为参数,这些服务是通过 ASP.NET Core 依赖注入系统提供的。通过依赖注入,可以在中间件中使用其他组件,如数据库上下文、日志记录器等。
    public class CustomMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<CustomMiddleware> _logger;
    
        public CustomMiddleware(RequestDelegate next, ILogger<CustomMiddleware> logger)
        {
            _next = next;
            _logger = logger;
        }
    
        // ...
    }
    
  3. 配置选项:
    • 如果中间件需要配置选项,可以通过构造函数参数传递配置信息。这样,中间件的行为可以在 Startup.cs 中进行配置。
    public class CustomMiddlewareOptions
    {
        public string OptionValue { get; set; }
    }
    
    public class CustomMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly CustomMiddlewareOptions _options;
    
        public CustomMiddleware(RequestDelegate next, IOptions<CustomMiddlewareOptions> options)
        {
            _next = next;
            _options = options.Value;
        }
    
        // ...
    }
    
3.2 上下文对象的作用和使用方法

HttpContext 是 ASP.NET Core 中间件中的关键对象,它提供了有关当前请求和响应的信息,允许中间件与请求处理流程进行交互。以下是 HttpContext 的主要作用和使用方法:

  1. 请求信息的获取:

    • 通过 HttpContext.Request 属性,可以获取有关当前请求的详细信息,如路径、方法、协议、头部、查询参数等。
    public async Task InvokeAsync(HttpContext context)
    {
        string path = context.Request.Path;
        string method = context.Request.Method;
        // 其他请求信息的获取
    }
    
  2. 响应信息的设置:

    • 通过 HttpContext.Response 属性,可以设置有关响应的信息,如状态码、头部、内容类型等。
    public async Task InvokeAsync(HttpContext context)
    {
        context.Response.StatusCode = 200;
        context.Response.ContentType = "text/plain";
        // 其他响应信息的设置
    }
    
  3. 处理请求和响应内容:

    • 通过 HttpContext.Request.BodyHttpContext.Response.Body 属性,可以访问请求和响应的主体内容,允许中间件对其进行读取或写入。
    public async Task InvokeAsync(HttpContext context)
    {
        using (StreamReader reader = new StreamReader(context.Request.Body))
        {
            string requestBody = await reader.ReadToEnd();
            // 处理请求主体内容
        }
    
        // 处理响应主体内容
        await context.Response.WriteAsync("Hello, World!");
    }
    
  4. 用户认证和授权信息:

    • HttpContext.User 属性包含有关用户的认证和授权信息,允许中间件根据用户的角色和声明执行相应的逻辑。
    public async Task InvokeAsync(HttpContext context)
    {
        ClaimsPrincipal user = context.User;
        // 处理用户认证和授权信息
    }
    
  5. 重定向和路由:

    • 通过 HttpContext.Response.Redirect 方法,可以执行重定向操作。而通过 HttpContext.GetRouteData 方法,可以获取有关当前路由的信息。
    public async Task InvokeAsync(HttpContext context)
    {
        // 执行重定向
        context.Response.Redirect("/newpath");
    
        // 获取路由信息
        RouteData routeData = context.GetRouteData();
        // 处理路由信息
    }
    
  6. 上下文的传递:

    • HttpContext.Items 属性允许中间件在请求处理流程中传递数据。这对于在中间件之间共享信息非常有用。
    public async Task InvokeAsync(HttpContext context)
    {
        context.Items["Key"] = "Value";
        // 在中间件之间传递数据
    }
    

通过充分利用 HttpContext 对象的这些功能,中间件可以与请求处理管道中的其他组件进行交互,执行特定的逻辑,并对请求和响应进行处理。

四、示例:记录请求日志的中间件

以下是一个简单的示例,展示如何创建一个记录请求日志的自定义中间件。该中间件将请求的路径和时间戳记录到控制台,并继续将请求传递给下一个中间件或处理程序。

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<LoggingMiddleware> _logger;

    public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 记录请求日志
        _logger.LogInformation($"Request logged: {context.Request.Path} at {DateTime.Now}");

        // 将请求传递给下一个中间件或处理程序
        await _next(context);
    }
}

然后,在 Startup.cs 文件的 Configure 方法中,注册这个中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)
{
    // 其他中间件

    // 注册日志中间件
    app.UseMiddleware<LoggingMiddleware>();

    // 其他中间件

    // 配置异常处理中间件等
}

在这个示例中,LoggingMiddleware 类接受 RequestDelegateILogger 作为构造函数参数,分别表示请求处理管道的下一个组件和日志记录器。在 InvokeAsync 方法中,记录请求的路径和时间戳,然后调用 _next(context) 将请求传递给下一个中间件或处理程序。

这个中间件可以用于记录每个请求的基本信息,对于调试和监视应用程序的运行非常有用。

五、总结

ASP.NET Core 中间件是请求处理管道中的可插拔组件,通过自定义中间件,开发人员能够灵活处理请求和响应。创建自定义中间件的基本步骤包括编写类、注册和配置中间件,同时理解中间件的参数和上下文对象的使用。自定义中间件的需求源自对特定业务逻辑、性能优化和模块化的需求。文章来源地址https://www.toymoban.com/news/detail-797851.html

到了这里,关于【ASP.NET Core 基础知识】--中间件--创建自定义中间件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • asp.net core中间件预防防止xss攻击

    上面实现思路是针对json序列化后的string字符串进行编码防止xss攻击 其他实现比如中间件、Action的AOP方法也是可以的,可以自己实现 主要是看web项目使用的是那个json序列化工具newtonsoft就用newtonsoft,system.text.json就用下面的那个

    2024年02月07日
    浏览(54)
  • 如何在 ASP.NET Core 配置请求超时中间件

    本文参考官方文档,使用Asp.net core 8.0 的最小API 模板项目,配置超时中间件。 超时中间件可用于所有类型的ASP.NET Core应用:最小 API、带控制器的 Web API、MVC 和 Razor Pages。请求超时的属性位于命名空间 Microsoft.AspNetCore.Http.Timeouts 中。 需要注意的是,当应用在调试模式下运行时

    2024年01月20日
    浏览(68)
  • 1.ASP.NET Core中间件管道MAP的作用?

    简述: Map基于给定请求路径的匹配项来创建请求管道分支。可以针对不同的路径添加不同的中间件。 详解: 中间件是组装到应用程序管道中以处理请求和响应的软件组件。 每个组件都选择是否将请求传递给管道中的下一个组件,并可以在管道中调用下一个组件之前和之后执

    2024年02月17日
    浏览(47)
  • .net 温故知新【17】:Asp.Net Core WebAPI 中间件

    到这篇文章为止,关于.NET \\\"温故知新\\\"系列的基础知识就完结了,从这一系列的系统回顾和再学习,对于.NET core、ASP.NET CORE又有了一个新的认识。 不光是从使用,还包括这些知识点的原理,虽然深入原理谈不上,但对于日常使用也够了,我想的是知其然,知其所以然。 在实际

    2024年01月18日
    浏览(59)
  • ASP.NET Core 的 Web Api 实现限流 中间件

    Microsoft.AspNetCore.RateLimiting  中间件提供速率限制(限流)中间件。 它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下: RateLimiterOptionsExtensions 类提供下列用于限制速率的扩展方法:​​​​​ 固定窗口限制器 滑动窗口限制器 令牌桶限

    2024年01月17日
    浏览(39)
  • asp.net core 一种基于token 和 Permission 的权限管理中间件示例

    asp.net core webapi 下面,想做一个过滤权限的Filter,配合token,对api做一个较为细粒度的权限控制, 该filter (PermissionFilter) 的作用是用户LoginUser.Permissions 列表中有 Key指定的权限才可以访问,没有则返回403 错误码。   1. 先上封装后的使用效果 说明:要求登录即可,不要求特定权限

    2024年02月05日
    浏览(111)
  • 精通中间件测试:Asp.Net Core实战指南,提升应用稳定性和可靠性

    在上一章节我们实战了在 Asp.Net Core 中的项目实战,这一章节讲解一下如何测试 Asp.Net Core 的中间件。 还记得我们在集成测试中提供的 TestServer 吗? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。包含了用于在测试环境中模拟 ASP.NET Core 应用程序的类和方法。通过使用 TestSe

    2024年04月22日
    浏览(49)
  • 「中间件」rabbitmq 消息队列基础知识

    RabbitMQ是一个消息队列软件,用于在应用程序之间转发消息。以下是RabbitMQ的基本概念: 消息:RabbitMQ中的消息是传递的基本单位,它由消息头和消息体组成。 队列(Queue):队列是消息的缓冲区,用于存储待处理的消息。 交换器(Exchange):交换器是接收生产者发送的消息并

    2024年02月07日
    浏览(61)
  • 网络安全基础知识&中间件简单介绍

    apache-httpd tomcat iis lighttp nginx:不是用来web服务器,而是用来做反向代理(tps10w,优化tqs2020w) fastdf:FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以

    2023年04月16日
    浏览(49)
  • 【前端知识】React 基础巩固(三十八)——log、thunk、applyMiddleware中间件的核心代码

    利用Monkey Patching,修改原有的程序逻辑,在调用dispatch的过程中,通过dispatchAndLog实现日志打印功能 redux中利用中间件 redux-thunk 可以让dispatch不不仅能处理对象,还能处理函数 单个调用函数来应用中间件,非常不方便,封装一个函数来合并中间件 在store/index.js中应用上面三个

    2024年02月14日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包