小白开学Asp.Net Core 《七》

小白开学Asp.Net Core 《七》

                           — — 探究中间件(MiddleWare)

1、何为中间件?

  中间件是组装到应用程序管道中以处理请求和响应的家伙,管道中的每个组件都要满足以下两个条件

  • 选择是否将请求传递给管道中的下一个组件

  • 可以在调用管道中的下一个组件之前和之后执行工作。

2、中间件的本质

 在.Net Core 中,中间件的本质就是一个Func的委托,其中RequestDelegate的本质也是一个委托(常常听人说,要想进阶到高级开发,必须要搞清楚委托。看来不得不搞懂委托了,本文默认您已搞懂了?如果没搞懂怎么办呢?不要紧,抽时间搞懂就行了),让我们来看看它的定义(证明我没在吹牛)

  640?wx_fmt=png

      再来看看 RequestDelegate

      640?wx_fmt=png

    接下来我尝试着解释下Func这个委托。我们都知道 Func 这个 内置的委托

     640?wx_fmt=png(我只截了与本文相关的一张图)

 通过Func 这个截图的定义来看,它接受一个 T  返回一个 TResult ,结合我们前面说的中间件640?wx_fmt=png来说,它接受一个RequestDelegate,返回一个RequestDelegate。也就是说,每一个中间件Func的传入参数RequestDelegate是下一个中间件的返回值,同时每一个中间件Func的返回值是前一个中间件的传入参数。这样就构成了一串中间件链表,每当一个请求过来,都会按照中间件的注册顺序依次执行RequestDelegate中的内容,这就构成了ASP.NET Core中的请求管道。(好好理解这句话,这是真理呀,开个玩笑,这是我本人这么认为的。)

这里得上一张经典的图配合上一句真理来理解就不那么难了。

  640?wx_fmt=png

  好,我们现在知道了Http请求处理管理是由多个Middleware组成的。可我们上面从没提到Http相关的信息,现在让我们看看它们是如何发生恋爱(产生关系的)?

  仔细看了前文的话,大家应该注意到RequestDelegate的定义(仔细回想下),哎 估计你们都想起来了,对还是上图我们再学习下     

           640?wx_fmt=png

 这次我把这个家伙的定义到截到图里,我们尝试着翻译下:A function that can process an HTTP request. 我将它翻译为:一个能够处理HTTP请求的 function(函数、方法)。是不是大家突然间知道了,原来是这个家伙让它们与HTTP关联在一起的(产生了恋情)。

 好,如果你不信的话就让我们来看看 HttpContext 这个家伙。为什么要看这个家伙呢,因为它是 RequestDelegate 这个委托 接受的参数。

  640?wx_fmt=png

    好了,这里不得不相信,.Net Core 的 Http 请求处理管道是由多个Middleware 组成的,并且 Middleware 与 Http 请求上下文 仅仅的关联在一起。

 

  使用Use、Run和Map 配置HTTP管道。

3、Use、Run和Map

  您可以使用Use、Run和Map 来配置HTTP管道,但各方法针对构建的中间件作用不同.

  Use:Use[Middleware]中间件负责调用管道中的下一个中间件,也可使管道短路(即不调用 next 请求委托)。

  Run:Run[Middleware]是一种约定,一些中间件组件可能会公开在管道末端运行的Run[Middleware]方法。

  Map:Map扩展用作约定来创建管道分支, Map*创建请求管道分支是基于给定请求路径的匹配项。

public class Startup	
{	public void Configure(IApplicationBuilder app)	{	app.Use(async (context, next) =>	{	// Do work that doesn't write to the Response.	await next.Invoke();	// Do logging or other work that doesn't write to the Response.	});	app.Run(async context =>	{	await context.Response.WriteAsync("Hello from 2nd delegate.");	});	}	
}

Use将多个请求委托链接在一起,next 参数表示管道中的下一个委托,可通过不 调用 next 参数使管道短路。 通常可在下一个委托前后执行操作。

当委托不将请求传递给下一个委托时,它被称为“让请求管道短路” 。 通常需要短路,因为这样可以避免不必要的工作。

 Run委托终止管道。意思就是说,使用的Run 委托后,Run 下面的所有方法将不会被执行。

public class Startup	
{	private static void HandleMap1(IApplicationBuilder app)	{	app.Run(async context =>	{	await context.Response.WriteAsync("Map  1");	});	}	private static void HandleMap2(IApplicationBuilder app)	{	app.Run(async context =>	{	await context.Response.WriteAsync("Map  2");	});	}	public void Configure(IApplicationBuilder app)	{	app.Map("/map1", HandleMap1);	app.Map("/map2", HandleMap2);	app.Run(async context =>	{	await context.Response.WriteAsync("Hello from End Map delegate.");	});	}	
}

执行与响应如下:

请求响应
localhost:5000
Hello from End Map delegate.

localhost:5000/map1

Map  1

localhost:5000/map2

Map  2

 

4、总结

  1)、中间件(Middleware)是由IApplicationBuilder来构建的

  2)、所有的代码截图都是 IApplicationBuilder F12后看到的

5、说明

  参考文章:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0


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

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

相关文章

【SHOI2017】相逢是问候【扩展欧拉定理】【复杂度分析】【线段树】

题意:给定一个长度为 nnn 的序列 aia_iai​,维护 mmm 次操作: 区间执行 ai←caia_i \leftarrow c^{a_i}ai​←cai​;区间求和 模 ppp。 其中 p,cp,cp,c 对所有操作相同。 n,m≤5104,p≤108n,m\leq 5\times 10^4,p\leq 10^8n,m≤…

aspnetcore 实现简单的伪静态化

aspnetcore 实现简单的伪静态化Intro在我的活动室预约项目中,有一个公告模块,类似于新闻发布,个人感觉像新闻这种网页基本就是发布的时候编辑一次之后就再也不会改了,最适合静态化了, 静态化之后用户请求的就是静态文件…

#530. 「LibreOJ β Round #5」最小倍数 二分 + 数论

传送门 文章目录题意:思路:题意: 思路: 本来想刷数位dpdpdp,无意间碰到了这个题来水水。 我们知道n!n!n!中质因子ppp的个数为∑i1npi\sum_{i1} \frac{n}{p^i}∑i1​pin​,所以我们就可以二分nnn&#xff0…

斜堆学习笔记+复杂度证明

和左偏树几乎一模一样,唯一的区别是左偏树合并后判断如果左儿子深度小于右儿子则交换左右儿子,而斜堆直接无脑交换。 复杂度是均摊的 O(nlog⁡n)O(n\log n)O(nlogn) 证明: 定义重结点为右儿子大小大于左儿子的结点,否则为轻结点…

《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文

写在开始三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击,现在可以致敬伟大的.NET斗士甲骨文了  (JDK8以上都需要收费,Android弃用java作为第一语言,别高兴:OpenJDK是甲骨文的).《ASP.NET Core 高性能系列》是一套如何编…

【NOIP2017】逛公园【最短路DAG】【dp】【拓扑排序】

题意:给一张帯权有向图,求 111 到 nnn 长度不超过最短路长度 kkk 的路径条数 模 PPP。有无数条输出 −1-1−1 。 n≤105,m≤2105,k≤50n\leq 10^5,m\leq 2\times 10^5,k\leq 50n≤105,m≤2105,k≤50,边权非负 先往最短路图想 发现 kkk 很小…

Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

传送门 文章目录题意:思路:题意: 思路: 首先我们知道如果所有数的和summodk!0sum\bmod k!0summodk!0那么此时无解,否则我们设needsum/kneedsum/kneedsum/k。 看到kkk这么小,自然的想到是否能状压&#xff…

资深开发者们是如何读书的?---线下读书会记录

读了多少书?怎么读书?——请问大家最近读书了吗?一年大概读了多少本书。有超过20本,超过30本,超过50本吗?在7月14日由长沙互联网活动基地和长沙.NET技术社区组织的小型社区活动,《开发者爱读书•…

【APIO2018】Duathlon 铁人两项 【圆方树】

题意:给一张 nnn 点 mmm 边的简单无向图,求有多少个三元组 (s,c,f)(s,c,f)(s,c,f) ,满足存在一条从 sss 到 fff 经过 ccc 的简单路径。 n≤105,m≤2105n\leq 10^5,m\leq 2\times 10^5n≤105,m≤2105 首先这个 “经过 ccc 的简单路径” &…

Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp + 输出方案

传送门 文章目录题意:思路:题意: 给你一个长度为nnn的序列aaa,你需要将其分成若干组,每组的价值为max⁡(ai)−min(ai)\max(a_i)-min(a_i)max(ai​)−min(ai​),求如何分组才能使得代价最小,输出…

架构杂谈《三》

一致性问题前面的《架构杂谈一》和《架构杂谈二》 杂谈了从服务化到微服务架构的演进,并肯定了服务化和微服务架构是一脉相承的。微服务在服务化架构的基础上,对服务化的细节和方案进行了优化和细化,重点突出了无中心化管理的微服务架构&…

【SDOI2018】战略游戏【圆方树】【虚树】

题意:给一张 nnn 点 mmm 边的连通无向图,qqq 次询问,每次给出一个点集 SSS ,求有多少个不在 SSS 中的点满足删除后 SSS 中存在两个点不连通。 n≤105,m≤2105,∑∣S∣≤2105n\leq 10^5,m\leq 2\times 10^5,\sum |S|\leq 2\times 1…

Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 思维 + 逆序对

传送门 文章目录题意:思路:题意: 给你两个长度为nnn的串a,ba,ba,b,每次可以同时翻转a,ba,ba,b中任意一段长度为L(1≤L≤n)L(1\le L\le n)L(1≤L≤n)的子串,问能否通过若干次操作使两个串相同。 思路: 首…

腾讯发布 Tencent SCF Toolkit VS Code 插件,轻松开发无服务器云函数

在之前的文章中,我们提到了亚马逊、谷歌、IBM 等大厂都上了 Visual Studio Code 的船。阿里巴巴也在近日发布了 Aliyun Serverless VS Code 插件。近期,腾讯也上了 VS Code 的船,发布了基于 VS Code 的 Tencent SCF Toolkit 插件,…

Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈

传送门 文章目录题意:思路:题意: 给你一个数nnn,有两个人博弈,每次可以将nnn减去一个nnn的因子,这个因子不能为111或nnn。当不能操作的人输掉游戏。问你先手赢还是后手赢。 思路: 这个题多写…

【POI2007】OSI-Axes of Symmetry【计算几何】【manacher】

题意:给一个 nnn 个点的多边形,求对称轴个数。 n≤105n\leq 10^5n≤105 显然对称轴一定在顶点或边的中点上。 但你 n2n^2n2 枚举完全没有一点能过的样子。 冷静分析,发现有 “中点”,“对称轴”,很自然个鬼地想到了…

端到端测试实践:Jenkins集成TestCafe

上一篇《对产品质量的一点思考》中说到自动化测试的重要性,本文简单介绍下怎样在实际项目中实现端到端测试的自动化,在这里我们使用的端到端测试工具是TestCafe。环境Jenkisn:2.183TestCafe:1.3.0为什么采用TestCafe做自动化测试要…

Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化

传送门 文章目录题意:思路:题意: 给你一个长度为nnn的数组,对每个位置iii求一个最大价值,价值计算方式如下:选择一个包含iii的[l,r][l,r][l,r],让后将其拿出来排序,之后价值就是当前…

【CF487E】Tourists【圆方树】【树链剖分】【multiset】

题意:给一张 nnn 点 mmm 边的连通无向图,点帯权,qqq 次操作: 修改一个点的权值。询问两点间所有简单路的最小权值的最小值。 n,m,q≤105n,m,q\leq 10^5n,m,q≤105 显然建出圆方树然后询问路径最小值。多半要树链剖分了。 对于方…

再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三

Gitlab runner 快速搭建CICD pipeline背景日常开发中,相信大家已经做了很多的自动化运维环境,用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包,部署全流水线Jenkins在devops担任了很重要的角色,但是另一方面…