7.6中间件

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: ASP.NET Core只是完成了HTTP请求调度、报文解析等必要的工作,像检查用户身份、设置缓存报文头等操作都是在中间件中完成,中间件就是ASP.NET Core的一个组件,由前逻辑、next、后逻辑3部分组成,多个中间件组成一个管道,一个系统中可以有多个管道。ASP.NET Core执行的过程就是http请求和响应按照中间件组装的顺序在中间件之间流转的过程。

7.6中间件

ASP.NET Core只是完成了HTTP请求调度、报文解析等必要的工作,像检查用户身份、设置缓存报文头等操作都是在中间件中完成,中间件就是ASP.NET Core的一个组件,由前逻辑、next、后逻辑3部分组成,多个中间件组成一个管道,一个系统中可以有多个管道。ASP.NET Core执行的过程就是http请求和响应按照中间件组装的顺序在中间件之间流转的过程。

管道引入中间件

WebApplication针对中间件具有3个重要的概念,Map、Use、Run。Map是用来引入请求的,请求来到管道后,组成管道的多个Use负责对请求进行预处理,Run负责主要的业务规则。

方法 作用
Map 定义一个管道可以处理哪些请求
Use 每个Use引入一个中间件,一个管道有若干个Use
Run 执行最终的业务逻辑,一般一个管道中只包含一个Run方法且在最后,因为Use引入的中间件可以把请求转到下一个中间件,但是执行Run方法处理就终止了

中间件演示

创建ASP.NET Core空项目,在Program.cs中添加:

varbuilder=WebApplication.CreateBuilder(args);

varapp=builder.Build();

//定义了对/test路径请求的处理,4-22为一个管道

app.Map("/test", asyncappbuilder=> {

   //声明第一个中间件

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

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

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

       awaitnext.Invoke();//执行下一个中间件

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

   });

   //声明第二个中间件

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

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

       awaitnext.Invoke();

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

   });

   //中间件执行完成后,执行run

   appbuilder.Run(asyncctx=> {

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

   });

});

app.Run();

//注意,如果在中间件中使用ctx.Response.WriteAsync等方式向客户端发送响应,我们就不能

//再执行next.Invoke了把请求转到其他中间件了,因为其他中间件可能会对response进行了修改

//该案例仅仅当做演示

请求/test结果如下:

中间件类

中间件类是一个普通的类,该类中需要一个构造方法,构造方法至少有一个RequestDelegate类型参数,该参数用来指向下一个中间件。类中还需要Invoke或者InvokeAsync的方法,方法中至少有一个HttpContext类型参数,返回值为Task类型。

publicclassCheckAndParsingMiddleware

{

   privatereadonlyRequestDelegatenext;

   publicCheckAndParsingMiddleware(RequestDelegatenext)

   {

       this.next=next;

   }

   //中间件的前逻辑、next、后逻辑都在这里

   publicasyncTaskInvokeAsync(HttpContextcontext)

   {

       stringpwd=context.Request.Query["password"];

       if (pwd=="123")

       {

           context.Items["BodyJson"] ="hellowrld";

           awaitnext(context);//传递到下一个中间件

       }

       else

       {

           context.Response.StatusCode=401;//不会传递到下一个中间件

       }

   }

}

Program.cs

varbuilder=WebApplication.CreateBuilder(args);

varapp=builder.Build();

app.Map("/test", asyncappbuilder=> {

   appbuilder.UseMiddleware<CheckAndParsingMiddleware>();//按注册顺序,执行中间件类的Invoke方法

   appbuilder.Run(asyncctx=> {

       Console.WriteLine("run start");

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

       ctx.Response.StatusCode=200;

       //HttpContext.Item在同一次请求中是共享的,用它来实现中间件之间数据的传递

       awaitctx.Response.WriteAsync(ctx.Items["BodyJson"].ToString());

       Console.WriteLine("run end");

   });

});

app.Run();

除了请求匹配的Map方法还有匹配Get请求的MapGet方法,匹配Post请求的MapPost方法。并且通过MapWhen方法中的Func<HttpContext,bool>参数可以过滤请求。

//报文头中AAA的值为123的请求所对应的管道

app.MapWhen(ctx=>ctx.Request.Headers["AAA"]=="123",asyncappbuilder=>{});

//请求路径以/api开头的所对应的管道

app.MapWhen(ctx=>ctx.Request.Path.StartsWithSegments("/api"),asyncappbuilder=>{});

中间件的组装顺序很重要,并且asp.net里面有很多内置的中间件在使用的时候一定要仔细阅读中间件组装顺序说明

筛选器和中间件的区别

ASP.NET Core MVC是由MVC中间件提供的框架,而筛选器数据MVC中间件中的功能

中间件 筛选器
ASP.NET Core提供的功能 ASP.NET Core MVC提供的功能
可以处理所有请求(控制器请求,静态文件等) 只能针对控制器的请求
无法处理IActionResult、ActionDescriptor等MVC特有概念 可以处理MVC框架中的概念
效率更高、范围更广、更底层

建议能使用中间件的情况尽量使用中间件,如果中间件和过滤器同时使用,则会先执行完所有的中间件前逻辑,然后执行过滤器,最后执行中间件的后逻辑。

相关文章
|
16天前
|
分布式计算 中间件 API
中间件应用集成的介绍
中间件应用集成在系统集成中扮演关键角色,通过中间件层连接和协调异构系统,促进通信与数据共享。它提供标准接口,简化集成过程,提升效率,实现业务流程统一。中间件类型多样,如集成、交易、工作量、门户中间件等,可根据需求定制,增强系统可用性、可扩展性,降低成本,助力企业提高效率和竞争力。
15 2
|
13天前
|
消息中间件 中间件 关系型数据库
阿里云中间件
阿里云中间件
10 1
|
13天前
|
安全 中间件 数据处理
中间件在应用集成
中间件是应用集成的关键,它连接不同系统、平台和应用,解决兼容性问题,实现数据交换和功能互操作。主要应用包括数据集成、服务集成、消息传递、安全与权限管理。选择中间件需考虑兼容性、性能、可扩展性和安全性。中间件简化通信,提高系统性能和可靠性,助力企业实现应用高效协同和商业价值。
15 2
|
7月前
|
分布式计算 算法 中间件
中间件的介绍
中间件的介绍
342 0
|
8月前
|
监控 JavaScript 前端开发
说说你对redux中间件的理解?常用的中间件有哪些?实现原理?
说说你对redux中间件的理解?常用的中间件有哪些?实现原理?
|
12月前
|
消息中间件 缓存 运维
聊聊中间件
聊聊中间件
|
存储 开发框架 cobar
|
网络协议 Ubuntu 中间件
浅谈分布式系统及其中间件
需要说明的是,截止目前,我对分布式系统的了解还很表面,所以以下也只是我了解到的概念和我的主观推测,如有错误,还请各位大佬指出哈~
399 1
|
中间件 Java Spring
从-1开始实现一个中间件
别人都写从0开始实现xxx,我先从-1开始就显得更牛逼一些。 今天,先开个头,来教大家怎么实现一个中间件。
从-1开始实现一个中间件
|
消息中间件 人工智能 Cloud Native