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

news2024/11/20 7:04:08

什么是中间件?

中间件是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.coloradmin.cn/o/516652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种KV存储的GC优化实践

作者&#xff1a;vivo 互联网服务器团队- Yuan Jian Wei 从内部需求出发&#xff0c;我们基于TiKV设计了一款兼容Redis的KV存储。基于TiKV的数据存储机制&#xff0c;对于窗口数据的处理以及过期数据的GC问题却成为一个难题。本文希望基于从KV存储的设计开始讲解&#xff0c;到…

MySQL 高级(进阶) SQL 语句三 存储过程

1.1 什么是存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来&#xff0c;这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时&#xff0c;只需要调用它…

中国物种物候和地面物候数据获取方法

物候学是研究自然界的植物&#xff08;包括农作物&#xff09;、动物和环境条件&#xff08;气候、水文、土壤条件&#xff09;的周期变化之间相互关系的科学。它的目的是认识自然季节现象变化的规律&#xff0c;以服务于农业生产和科学研究。 [3-4] 物候既可指生物的周期性…

从0到1复现斯坦福羊驼(Stanford Alpaca 7B)

近日&#xff0c;Meta开源了他们的LLaMA系列模型&#xff0c;包含了参数量为7B/13B/33B/65B的不同模型&#xff0c;然而&#xff0c;原模型的效果较差&#xff08;如生成的结果文不对题、以及无法自然地结束生成等&#xff09;。因此&#xff0c;斯坦福的 Alpaca 模型基于 LLaM…

基于AT89C51单片机的简易电梯上下楼层间移动系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87776511?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 采用单片AT89C51芯片进行电梯控制系统的设计方法&#xff0c;主要阐述如何使用单机进行编程来实…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 7 Clustering

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 7 Clustering The requirements for a function on pairs of points to be a distance measure are that: Distances are always nonnegative, and only the distance between a point and itse…

泰克示波器MSO54B 5-BW-1000,4通道1G带宽

泰克MSO5B系列示波器&#xff0c;支持广泛的特定应用测量&#xff0c;满足您的各种需求。单独添加高级分析程序包或安装应用程序包&#xff0c;以处理更多不同的工作。 支持超过 25 种串行协议&#xff0c;覆盖常见的接口先进的单相和三相功率分析程序包确保信号完整性和电源完…

邮件系统市场行情分析

前言 随着网络信息化的不断发展&#xff0c;邮件系统也日益成为企业对外沟通交流的重要工具&#xff0c;成为了企业的刚需。随着邮件系统技术的不断完善与发展&#xff0c;企业对于邮件系统功能的也提出了更高的要求。市面上逐渐诞生了众多的品牌和厂家。不同的厂家在系统的功能…

HummerRisk 常见问题 (一)

本文汇总了一些 HummerRisk 使用过程中的常见问题&#xff0c;希望可以帮助大家快速排查和解决问题&#xff0c;更加顺畅的使用 HummerRisk 云原生安全平台。 安装问题 Q.安装过程中&#xff0c;Docker 检测失败&#xff1f; A. 默认情况下&#xff0c;使用 HummerRisk 安装脚…

已知 IP 地址是 128.14.35.7/20。求网络地址

首先知道公式 然后我们由 128得出这个是B类IP地址 默认是16位1 但是 所给IP已经给了 掩码长度 所以求出了就知道 掩码 就可以求出了

MySQL学习---12、视图

1、常见的数据库对象 对象描述表(Table)表时存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是字段数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&…

银河麒麟系统Arm64编译opencv指南

进入opencv官网下载版本&#xff1b;我这边下载的是2.4.13.6 &#xff1b;根据需要下载最新的 Releases - OpenCV 拷贝进麒麟系统我这边是麒麟V10 sp1 2204&#xff1b;并解 cmake 在麒麟应用商城中安装&#xff1b; 打开cmake 设置opencv路径&#xff1b;builder文件夹可以自…

福音:IDEA、VSCODE神级插件Bito

文章目录 Bito是什么&#xff1f;IDEA环境安装注册使用 VSCODE环境疑难问题后叙 Bito是什么&#xff1f; Bito是一款在编程软件中使用的插件&#xff0c;由ChatGPT团队开发&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。 Bito的AI帮助开发人员极大地提高了其…

【已解决】windows电脑上无法打开iPhone中的照片

出门旅游后&#xff0c;想必很多小伙伴的手机里都会存下一大堆照片&#xff0c;回来后想直接导入Windows查看筛选&#xff0c;可有些人会发现无法显示图片的内容&#xff0c;提示不支持该格式或文件损坏&#xff0c;这是为什么呢&#xff1f; 这是因为用iPhone手机的话&#xf…

CentOS 安装 redis-cli以及linux操作redis

1&#xff0c;CentOS 安装 redis-cli步骤如下&#xff1a; wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make redis-cli 2&#xff0c;linux操作redis 到 redis-cli安装的目录找到 redis-cli然后执行命令 ./redis-cli…

JavaScript全解析-闭包

闭包 重新认识函数 ●一个函数分为函数的定义和函数的执行 函数的定义 ●我们书写一个函数, 但是不会执行函数体内的代码 ●那定义一个函数做了什么事情 ○在堆内存中开辟一段存储空间 ○把你书写在函数体内的代码, 全部以字符串的形式存储在这存储空间中, 此时不会解析变量 ○…

周五直播Talk | MIT许逸伦:解锁由物理启发的深度生成模型-从扩散模型到泊松流模型

受到物理、数学等学科的启发&#xff0c;AIGC大模型发展迎来一波技术颠覆。交叉学科里蕴含的巨大能量&#xff0c;为科研人带来创新视角和思维启迪。 北京时间4月28日(周五)10:00&#xff0c;将门-TechBeat社区邀请到麻省理工学院电子与计算机科学系博士生——许逸伦&#xff…

CloudOS:一个平台汇聚云原生技术栈

云原生技术栈是一种新型的技术架构&#xff0c;旨在支持云计算环境下的应用程序开发和部署。它是一种基于容器、微服务、自动化和云平台的技术栈&#xff0c;可以帮助企业更快速、更高效地构建、部署和管理应用程序&#xff0c;成为加速企业数字化业务高效创新、实现企业数字化…

电商如何利用API接口获取商品信息数据

随着电商和互联网的快速发展&#xff0c;API&#xff08;应用程序编程接口&#xff09;的重要性也越来越明显。API接口可以让不同系统之间进行数据交互和通信&#xff0c;进而实现更高效的业务协同和数据共享。在电商业务中&#xff0c;API可以帮助企业实现多个业务系统之间的数…

【数据结构】简单到有摸鱼负罪感的栈的实现

【数据结构】简单到有摸鱼负罪感的栈的实现 一、前言1、什么是栈&#xff1f;2、关于实现的结构选取 二、目标三、实现1、初始化工作2、压栈(push)2.1、图解思路2.2、代码实现 3、弹栈(pop)3.1、图解思路3.2、代码实现 4、打印栈(用于测试)5、返回栈顶数据6、返回栈的数据个数7…