c# 中间件简说

一、什么是中间件

中间件是一种装配到应用管道以处理请求和响应的软件。是介于request与response处理过程之间的一个插件(一道处理过程),相对比较轻量级,并且在全局上会影响到request对象和response对象的属性。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。每个组件:

1、选择是否将请求传递到管道中的下一个组件。

2、可在管道中的下一个组件前后执行工作。

原理图:

多个中间件时,中间件请求和响应的中间件顺序相反

二、为什么使用中间件

在我们很多时候,当一个请求过来之后,我们想对这个请求做各种各样的操作和记录,这个时候我们可以加入中间件。目的就是对这个请求和响应做处理,其实不难理解,这就是类似于工业机器,一个商品出来之前会有很多关卡,会执行N到工序。最后加工出来的产品就是我们想要的,也是安全的。这些关卡就类似于中间件的作用了。

微软约定中间件需要两个参数,一个是httpcontext上下文对象,一个是Task类型的委托。通过上下文对象,处理请求,通过委托传递上下文对象到下一个中间件。核心就是一系列的请求委托,Run、Use、Map

  • Run:是最后一道工序,管道末尾。
  • Use:连接请求委托,next 向下走。
  • Map:扩展用作约定创建管道分支。

三、定义中间件

中间件的处理流程就像一个俄罗斯套娃,微软约定中间件需要两个参数,一个是httpcontext上下文对象,一个是Task类型的委托。通过上下文对象,处理请求,通过委托传递上下文对象到下一个中间件,这也是套娃模式的由来。RequestDelegate是管道的核心。ApplicationBuilder就是接收了很多个RequestDelegae把它拼到一起。

 public class TestMiddleware
    {

        /// <summary>
        /// App授权配置信息
        /// </summary>
        internal TestDomain confDomain;

        /// <summary>
        /// 请求处理Request日志任务的 委托
        /// </summary>
        private readonly RequestDelegate _next;

        /// <summary>
        /// 构造函数  只会初始化一次
        /// </summary>
        /// <remarks>
        /// <para/>Author   :  hyy
        /// <para/>Date     :  2022-12-07 23:031
        /// </remarks>
        /// <param name="next">构建</param>
        /// <param name="authConfig">配置参数</param>
        public TestMiddleware(RequestDelegate next, TestDomain authConfig)
        {
            LogHelper.Info("TestMiddleware 初始化");
            _next = next;
            confDomain = authConfig;
        }

        /// <summary>
        /// 中间件调用函数
        /// </summary>
        /// <remarks>
        /// <para/>Date     :  2022-12-07
        /// <para/>Author   :  HUYOUYANG
        /// </remarks>
        /// <param name="context">当前上下文HttpContext对象</param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            LogHelper.Info("TestMiddleware request");
            ///调用之前
            await _next(context);
            // 调用之后
            LogHelper.Info("TestMiddleware result");

        }

定义

封装拓展方法

创建一个中间件拓展类,为每个自定义中间件创建方法,通过IApplicationBuilder拓展方法暴露

我这里定义了三个相同的只是日志文本不同的中间件

     /// <summary>
        /// UseTestMiddleware
        /// </summary>
        /// <remarks>
        /// <para/>Author   :  hyy
        /// <para/>Date     :  2023-12-08 10:05
        /// </remarks>
        /// <param name="builder">builder</param>
        /// <param name="authConfig">参数</param>
        /// <returns>builder</returns>
        public static IApplicationBuilder UseTestMiddleware(this IApplicationBuilder builder, TestDomain authConfig)
        {
            return builder.UseMiddleware<TestMiddleware>(authConfig);
        }
        /// <summary>
        /// UseTestMiddleware
        /// </summary>
        /// <remarks>
        /// <para/>Author   :  hyy
        /// <para/>Date     :  2023-12-08 10:05
        /// </remarks>
        /// <param name="builder">builder</param>
        /// <param name="authConfig">参数</param>
        /// <returns>builder</returns>
        public static IApplicationBuilder UseTest1Middleware(this IApplicationBuilder builder, TestDomain authConfig)
        {
            return builder.UseMiddleware<Test1Middleware>(authConfig);
        }
        /// <summary>
        /// UseTestMiddleware
        /// </summary>
        /// <remarks>
        /// <para/>Author   :  hyy
        /// <para/>Date     :  2023-12-08 10:05
        /// </remarks>
        /// <param name="builder">builder</param>
        /// <param name="authConfig">参数</param>
        /// <returns>builder</returns>
        public static IApplicationBuilder UseTest2Middleware(this IApplicationBuilder builder, TestDomain authConfig)
        {
            return builder.UseMiddleware<Test2Middleware>(authConfig);
        }

四、配置使用中间件

使用中间件

注意:使用中间件,顺序非常重要。比如此处,要放在权限处理的前面。不然请求从管道回来的时候,会先走消息处理,然后再判断权限,这样的话就无法处理了。因为使用多个中间件时,中间件请求和响应的顺序是相反的,此处还是爬楼看上面的原理图比较清晰。

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }
            // HYY
            app.UseTestMiddleware(Configuration.GetSection("TestDomain").Get<TestDomain>());

            app.UseTest1Middleware(Configuration.GetSection("TestDomain").Get<TestDomain>());
            app.UseTest2Middleware(Configuration.GetSection("TestDomain").Get<TestDomain>());

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }

五、演示

定义测试Http接口:

Http请求测试:

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

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

相关文章

log4j(日志的配置)

日志一般配置在resources的config下面的&#xff0c;并且Util当中的initLogRecord中的initLog&#xff08;&#xff09;方法就是加载这个log4j.properties的. 首先先看log4j.properties的配置文件 log4j.rootLoggerdebug, stdout, Rlog4j.appender.stdoutorg.apache.log4j.Co…

数据可视化:解锁企业经营的智慧之道

在现代企业管理中&#xff0c;数据可视化已经成为了一项重要的工具。它不仅仅是简单地展示数据&#xff0c;更是提供了深入理解数据、做出更明智决策的方法。作为一名可视化设计从业人员&#xff0c;我经手过一些企业自用的数据可视化项目&#xff0c;今天就来和大家聊聊数据可…

同一个kmz数据同样的底图在QGIS上显示位置正常, 在Mars3d中显示就偏移了一些

问题&#xff1a; 1.同一个kmz数据同样的底图在QGIS上显示位置正常, 在网页中显示就偏移了一些 在qgis上的显示效果&#xff0c;和在mars3d的显示效果&#xff1a;数据明显存在偏移。 解决步骤&#xff1a; 1.查看了kmz数据&#xff0c;里面实际是tif图片数据&#xff0c;估…

消息队列kafka详解:Kafka重要知识点+面试题大全

重要面试知识点 Kafka 消费端确保一个 Partition 在一个消费者组内只能被一个消费者消费。这句话改怎么理解呢&#xff1f; 在同一个消费者组内&#xff0c;一个 Partition 只能被一个消费者消费。 在同一个消费者组内&#xff0c;所有消费者组合起来必定可以消费一个 Topic 下…

gitee对接使用

1.创建一个文件夹 2.进入Gitee接受对方项目编辑 3.打开终端初始化一开始创建的文件夹 git init 3.1打开终端 3.2输入git.init 4.克隆对方的项目 4.1进入Gitee复制对方项目的路径 4.2在编辑器终端内克隆对方项目 git clone 网址 如此你的编辑器就会出现对方的项目 …

docker 资源控制

Docker的资源控制 对容器使用宿主机的资源进行限制&#xff0c;如cpu&#xff0c;内存&#xff0c;磁盘I/O Docker使用linux自带的功能cgroup(control grouos)是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程组使用的物理资源 Docker借助这个机制&…

高性能和多级高可用,云原生数据库 GaiaDB 架构设计解析

1 云原生数据库和 GaiaDB 目前&#xff0c;云原生数据库已经被各行各业大规模投入到实际生产中&#xff0c;最终的目标都是「单机 分布式一体化」。但在演进路线上&#xff0c;当前主要有两个略有不同的路径。 一种是各大公有云厂商选择的优先保证上云兼容性的路线。它基于存…

电商系统架构演进

聊聊电商系统架构演进 具体以电子商务网站为例&#xff0c; 展示web应用的架构演变过程。 1.0时代 这个时候是一个web项目里包含了所有的模块&#xff0c;一个数据库里包含了所需要的所有表&#xff0c;这时候网站访问量增加时&#xff0c;首先遇到瓶颈的是应用服务器连接数&a…

“探究HarmonyOS:深入解析鸿蒙操作系统架构”

前言 一、鸿蒙操作系统是什么&#xff1f; 二、为什么要学习鸿蒙操作系统 1.从开发者角度看&#xff1a; 2.从使用者角度看&#xff1a; 总结 前言 随着智能化时代的到来&#xff0c;操作系统的发展也越来越快&#xff0c;人们对于智能化生活的需求也越来越强烈。鸿蒙操作系统作…

【C++】异常处理 ⑦ ( 异常类的继承层次结构 | 抛出 / 捕获 多个类型异常对象 | 抛出子类异常对象 / 捕获并处理 父类异常对象 )

文章目录 一、抛出 / 捕获 多个类型异常对象1、抛出 / 捕获 多个类型异常对象2、操作弊端3、完整代码示例 二、异常类的继承层次结构1、抛出子类异常对象 / 捕获并处理 父类异常对象2、完整代码示例 - 抛出子类异常对象 / 捕获并处理 父类异常对象 自定义的 异常类 , 可能存在 …

canvas绘制运动的圆

代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdev…

JAVA实现敏感词高亮或打码过滤:sensitive-word

练手项目中实现发表文章时检测文章是否带有敏感词&#xff0c;以及对所有敏感词的一键过滤功能 文章目录 效果预览实现步骤 效果预览 随便复制一篇内容到输入框 机器审核文章存在敏感词&#xff0c;弹消息提示并进入人工审核阶段&#xff08;若机器审核通过&#xff0c;则无需审…