.Net中间件的概念---杨中科笔记

news/2024/9/8 5:43:40/

什么是中间件?

中间件是ASP.NET Core的核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。

中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。开发人员可以对组成管道的中间件按照需要进行自由组合。

 

中间件的三个概念

Map、Use和Run。Map用来定义一个管道可以处理哪些请求,Use和Run用来定义管道,一个管道由若干个Use和一个Run组成,每个Use引入一个中间件,而Run是用来执行最终的核心应用逻辑。

使用场景

自定义中间件的使用场景是当你需要在应用程序的请求和响应处理中添加一些特定的逻辑或功能时例如身份验证、错误处理、日志记录、缓存等。. ASP.NET Core 提供了一些内置的中间件组件,但你也可以编写自己的中间件来满足你的需求。

常见的 .Net 中间件的案例有:

  • 身份验证中间件:验证用户的身份,并在上下文中设置用户主体。
  • 静态文件中间件:提供静态文件,如图片、CSS、JavaScript 等。
  • 路由中间件:将请求映射到终结点,如控制器、页面、信号 R 中心等。
  • 异常处理中间件:捕获未处理的异常,并返回友好的错误页面或响应。
  • 日志记录中间件:记录请求和响应的详细信息,以便进行调试或分析。

中间件与过滤器的区别

中间件和过滤器都是用来在请求和响应的过程中添加一些逻辑或功能的组件,但它们有一些区别。 中间件是在应用程序管道中的一个组件,它可以拦截请求并决定是否将请求转移给下一个中间件,或者直接返回响应。过滤器是在 MVC 框架中的一个组件,它可以在控制器的动作执行前后添加一些逻辑或功能,例如授权、异常处理、缓存等。过滤器只能应用于 MVC 的请求,而中间件可以应用于任何类型的请求。

优先选择使用中间件;但是如果这个组件只针对MVC或者需要调用一些MVC相关的类的时候,我们就只能选择Filter

简单定义一个中间件

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.Map("/test", async appbuilder => {

    appbuilder.Use(async (context, next) => {

        context.Response.ContentType = "text/html";

        await context.Response.WriteAsync("1  Start<br/>");

        await next.Invoke();

        await context.Response.WriteAsync("1  End<br/>");

    });

    appbuilder.Use(async (context, next) => {

        await context.Response.WriteAsync("2  Start<br/>");

        await next.Invoke();

        await context.Response.WriteAsync("2  End<br/>");

    });   

    appbuilder.Run(async ctx => {

        await ctx.Response.WriteAsync("hello middleware <br/>");

    });

});

app.Run();

使用中间件类:

中间件类是一个普通的.NET类,它不需要继承任何父类或者实现任何接口,但是这个类需要有一个构造方法,构造方法至少要有一个RequestDelegate类型的参数,这个参数用来指向下一个中间件。这个类还需要定义一个名字为Invoke或InvokeAsync的方法,方法至少有一个HttpContext类型的参数,方法的返回值必须是Task类型。中间件类的构造方法和Invoke(或InvokeAsync)方法还可以定义其他参数,其他参数的值会通过依赖注入自动赋值。

public class CheckAndParsingMiddleware

{

    private readonly RequestDelegate next;

    public CheckAndParsingMiddleware(RequestDelegate next)

    {

        this.next = next;

    }

    public async Task InvokeAsync(HttpContext context)

    {

        string pwd = context.Request.Query["password"];

        if (pwd == "123")

        {

            if (context.Request.HasJsonContentType())//判断请求是否是Json类型

            {

                var reqStream = context.Request.BodyReader.AsStream();

                dynamic? jsonObj = DJson.Parse(reqStream);

                context.Items["BodyJson"] = jsonObj;

            }

            await next(context);

        }

        else context.Response.StatusCode = 401;

    }

}

配置文件配置

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.Map("/test", async appbuilder => {

    appbuilder.UseMiddleware<CheckAndParsingMiddleware>();

    appbuilder.Run(async ctx => {

        ctx.Response.ContentType = "text/html";

        ctx.Response.StatusCode = 200;

        dynamic? jsonObj = ctx.Items["BodyJson"];

        int i = jsonObj.i;

        int j = jsonObj.j;

        await ctx.Response.WriteAsync($"{i}+{j}={i+j}");

    });

});

app.Run();


http://www.ppmy.cn/news/67900.html

相关文章

智能优化算法——下山单纯型算法

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、算法流程1. 反射2. 膨胀…

10-HTML-表单标签

标签描述<form>定义供用户输入的 HTML 表单。<input>定义输入控件。<textarea>定义多行的文本输入控件。<button>定义按钮。<select>定义选择列表&#xff08;下拉列表&#xff09;。<optgroup>定义选择列表中相关选项的组合。<option&…

rtl仿真器-iverilog icarus安装和测试

Icarus Verilog是一个轻量、免费、开源的Verilog编译器&#xff0c;基于C实现&#xff0c;开发者是 Stephen Williams &#xff0c;遵循 GNU GPL license 许可证&#xff0c;安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真&#xff0c;命令行操作方式&#xff0c…

太阳诱电|什么是低频振荡?低频振荡名词解释

低频振荡是指在振荡系统中发生的频率较低的振动。在物理学中&#xff0c;振动是指物体在某一位置附近的周期性运动。当物体发生振动时&#xff0c;它会沿着某个方向来回振动&#xff0c;而振荡的频率就是物体在单位时间内来回振动的次数。 低频振荡的频率通常指的是从几赫兹到…

opencv实践项目-多张图片拼接之stitcher

目录 1.简介2. 拼接算法流程3. 代码演示 1.简介 OpenCV从2.4.x版本之后多出来一个新的模型 图像拼接&#xff0c;该模块通过简单的高级API设置&#xff0c;可以获得比较好的图像拼接效果&#xff0c;OpenCV官方提供了一个高度集成的API函数 Stitcher&#xff0c;只要两行代码就…

Chromium源码视频播放分析

​ 下载代码&#xff0c;调试方法等见Chromium视频播放相关调试记录_bberdong的博客-CSDN博客 硬解流程 GPU进程 MediaService::CreateInterfaceFactory&#xff0c;然后创建了InterfaceFactoryImpl。 创建解码器 gpu进程收到了一个message创建了一个MojoVideoDecoderServ…

携手共建数字钢铁,Hightopo亮相第三届钢铁展洽会

4 月 26 日备受期待的第三届钢铁展洽会在日照盛大召开。图扑软件作为智慧钢铁行业领先的 2D 和 3D 图形界面可视化解决方案提供商&#xff0c;受邀参与此次展会。 图扑软件携智慧钢铁三维可视化监控体系亮相“钢铁展洽会”&#xff0c;向众多钢铁企业展示了一系列图扑 HT 数字…

Flink Kafka-Source

文章目录 Kafka Source1. 使用方法2. Topic / Partition 订阅3. 消息解析4. 起始消费位点5. 有界 / 无界模式6. 其他属性7. 动态分区检查8. 事件时间和水印9. 空闲10. 消费位点提交11. 监控12. 安全 Apache Kafka 连接器 Flink 提供了 Apache Kafka 连接器使用精确一次&#xf…

安卓源码下apk进行platform签名的方法

目录 一 任意目录下创建一个文件夹 二 该目录下需要准备的5个文件 三 执行命令 四 生成结果 一 任意目录下创建一个文件夹 二 该目录下需要准备的5个文件 上述五个文件&#xff0c; 前四个可以从编译好的安卓源码工程目录下复制&#xff0c; 第五个是自己需要签名的apk文件 …

springboot+vue汉服文化平台网站(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汉服文化平台网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

Java实现网上人才招聘系统【附源码】

网上人才招聘系统 1、概述 3 2、系统分析 4 2.1、问题定义 4 2.2、可行性研究 4 2.2.1、可行性需求分析 4 2.2.2、数据流分析 5 2.2.3、数据字典 6 2.2.4、程序流程图 6 2.2.4、开发进度计划 6 2.3、需求分析 7 2.3.1、功能需求分析 7 2.3.2、数据需求分析 10 2.3.3、性能需求…

【Ubuntu20.04】ROS noetic的g2o与系统g2o冲突问题

文章目录 0.问题描述1.问题原因2.解决方法2.1.方法12.1.方法2 3.成功效果 0.问题描述 \qquad 从github安装2023版本的g2o时&#xff0c;若ROS也安装了g2o&#xff0c;则会在编译时触发运行时冲突。具体表现为段错误&#xff0c;如若需要排查是否为ROS的g2o导致&#xff0c;则需…

systemctl针对timer的配置文件

文章目录 systemctl针对timer的配置文件systemd.timer的优势任务需求sname.timer的设置值使用于OnCalendar的时间一个循环实际运行案例一个固定日期运行的案例 systemctl针对timer的配置文件 有时候&#xff0c;你想要定期执行某些服务或是启动后执行&#xff0c;或是什么服务…

软件测试基础知识整理(三)- 软件测试、软件质量模型、软件测试流程

目录 一、软件测试 1.1 什么是软件测试 1.2 目的 1.3 定义 1.4 软件测试的原则 二、软件质量模型 2.1 软件质量模型&#xff08;ISO9126&#xff09; 2.2 软件质量保证&#xff08;SQA&#xff09; 2.2.1 定义、目的、目标 2.2.2 QC 和 QA 三、软件测试基本流程 一、…

【Vue工程】010-UnoCSS 即时按需原子 CSS 引擎

【Vue工程】010-UnoCSS 即时按需原子 CSS 引擎 文章目录 【Vue工程】010-UnoCSS 即时按需原子 CSS 引擎一、概述1、简介2、官网 二、基本使用1、安装2、修改 vite.config.ts3、根目录创建 uno.config.ts4、在 main.ts 中引入5、VS Code 安装 UnoCSS 插件6、在组件中使用7、访问…

身为企业管理者,必须了解的财务知识

财务管理工作是企业管理工作中的核心内容&#xff0c;也是企业管理工作中的难点内容&#xff0c;对于集团企业来讲更是任务艰巨而又问题频出。然而&#xff0c;信息时代的来临为解决和完善企业财务管理问题提供了新思路&#xff0c;就集团企业而言&#xff0c;财务管理信息化基…

k8s架构了解

Kubernetes(k8s)是用于自动部署、扩展和管理“容器化应用程序”的开源系统 k8s由control plane以及cluster nodes构成 control plane control plane是维护所有k8s对象记录的系统&#xff0c;持续管理着对象状态&#xff0c;并且对集群的变化做出响应&#xff0c;并使状态匹…

《论文阅读》基于提示的知识生成解决对话情感推理难题

《论文阅读》基于提示的知识生成解决对话情感推理难题 前言摘要作者新观点问题定义模型框架Global ModelLocal ModelPrompt Based Knowledge Generation分类器实验结果问题前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失…

MYSQL基本操作

数据库的列类型 int&#xff1a;整型 用于定义整数类型的数据 float&#xff1a;单精度浮点4字节32位 准确表示到小数点后六位 double&#xff1a;双精度浮点8字节64位 char&#xff1a;固定长度的字符类 用于定义字符类型数据&#xff0c;固定10字节&#xff0c;如果你设定5字…

Hash碰撞

Hash碰撞 什么是Hash碰撞 Hash碰撞是指两个不同的输入值&#xff0c;经过哈希函数的处理后&#xff0c;得到相同的输出值&#xff0c;这种情况被称之为哈希碰撞。 例如&#xff1a;两个不同的对象&#xff08;object1和object2的值&#xff09;经过Hash函数计算后的&#xf…