.NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(上)...

21 | 中间件:掌控请求处理过程的关键

这一节讲解一下如何通过中间件来管理请求处理过程

中间件工作原理

next 表示后面有一个委托,每一层每一层套下去可以在任意的中间件来决定在后面的中间件之前执行什么,或者说在所有中间件执行完之后执行什么

整个中间件的处理过程实际上有两个核心对象:

IApplicationBuilder

RequestDelegate:处理整个请求的委托

源码链接:
https://github.com/witskeeper/geektime/tree/master/samples/MiddlewareDemo

IApplicationBuilder

namespace Microsoft.AspNetCore.Builder
{public interface IApplicationBuilder{IServiceProvider ApplicationServices { get; set; }IDictionary<string, object> Properties { get; }IFeatureCollection ServerFeatures { get; }// 最终它会 Build 返回一个委托// 这个委托就是把所有的中间件串起来之后,合并成一个委托方法// 这个方法的入参可以看下方委托的定义RequestDelegate Build();IApplicationBuilder New();// 它可以让我们去注册我们的中间件,把委托注册进去,每一个委托的入参也是一个委托// 这也就意味着可以把这些委托注册成一个链,就像上面的图显示的那样IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);}
}

委托的定义

namespace Microsoft.AspNetCore.Http
{// 委托的入参是 HttpContext,所有的注册中间件的委托实际上都是对 HttpContext 的处理public delegate Task RequestDelegate(HttpContext context);
}

接着让我们看一下应用程序里面是怎么让它工作的?

之前课程讲过 Configure 方法是用来注册中间件的

app.UseMyMiddleware();app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>
{endpoints.MapControllers();
});

根据刚才流程图表示的话,实际上中间件的执行顺序是跟注册顺序有关系的,最早注册的中间件它的权力是最大的,它可以越早的发生作用

中间件的注册实际上不仅仅是有上面展示的已有内置的中间件,实际上还可以用注册委托的方法来注册我们的逻辑

app.Use(async (context, next) =>
{await context.Response.WriteAsync("Hello");
});

因为这个中间件注册最早,而且不对后续的 next 做任何操作,所以启动之后无论输入什么都会输出 Hello

如果需要后续的中间件执行,那就意味着需要调用 next,可以在中间件执行之后再次 Hello 一次

app.Use(async (context, next) =>
{await context.Response.WriteAsync("Hello");await next();await context.Response.WriteAsync("Hello2");
});

启动程序报错:

System.InvalidOperationException: Headers are read-only, response has already started.

意味着一旦应用程序已经对 Response 输出内容,我们就不能对 header 进行操作了,但是可以在 Response 后续继续写出信息

app.Use(async (context, next) =>
{//await context.Response.WriteAsync("Hello");await next();await context.Response.WriteAsync("Hello2");
});

实际上除了 Use 这种方式的话,还有 Map 的方式

app.Map("/abc", abcBuilder =>
{abcBuilder.Use(async (context, next) =>{//await context.Response.WriteAsync("Hello");await next();await context.Response.WriteAsync("Hello2");});
});

启动程序不会直接看到 Hello 输出,如果把地址改为 localhost:5001/abc,我们的输出就会变成 Hello2

也就是说当我们需要对特定的路径进行指定中间件的时候可以这样做

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

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

相关文章

angularjsl路由_AngularJs ng-route路由详解

本篇基于ng-route来讲下angular中的路由&#xff0c;路由功能主要是 $routeProvider服务 与 ng-view 实现。ng-view的实现原理&#xff0c;是根据路由的切换&#xff0c;动态编译html模板——$compile(html)(scope)。前提首先需要在页面引入angular和angular-route&#xff0c;…

pandas中Series的map函数详解

Series的map函数 Series的map方法可以接受一个函数或含有映射关系的字典型对象。使用map是一种实现元素级转换以及其他数据清理工作的便捷方式。DataFrame中对应的是applymap()函数&#xff0c;当然DataFrame还有apply()函数 1.字典映射 例如&#xff0c;对数据的某个字段进…

简单的二叉树创建与遍历

编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;空格字符代表空树。建立起此二叉树以后&…

tof摄像头手势识别_一种基于TOF手势识别的控制系统的制作方法

本发明属于汽车零配件技术领域&#xff0c;尤其是一种基于TOF手势识别的控制系统。背景技术&#xff1a;随着触摸屏技术的不断推广&#xff0c;用户已经适应并逐渐熟悉了与机器的互动。现在&#xff0c;人机互动技术已迈上了更高的台阶&#xff0c;进入了手势识别时代。随着手势…

疫情期间,千万级系统宕机N次,老板撂下狠话:没法把性提升10倍,全员解雇!...

性能调优整体思路作为一名团队技术核心&#xff0c;如何让系统跑得通、跑得稳、跑得快是必然会面对的场景。性能分析是一个大课题&#xff0c;不同的架构、不同的应用场景、不同的程序语言分析的方法若有差异&#xff0c;抽象一下大致分为两类&#xff1a;自底向上&#xff1a;…

Pandas - 查看DataFrame信息

数据表信息查看 1、维度查看&#xff1a; df.shape2、数据表基本信息&#xff08;维度、列名称、数据格式、所占空间等&#xff09;&#xff1a; df.info()3、每一列数据的格式&#xff1a; df.dtypes4、某一列格式&#xff1a; df[B].dtype5、空值&#xff1a; df.isnul…

hdu2602 Bone Collector-01背包问题

Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag with a volume of…

对比Java和.NET多线程编程

这篇文章以对比的方式总结Java和.NET多线程编程。基本概念多线程&#xff1a;很多开发语言都提供多线程编程支持&#xff0c;比如Java&#xff0c;C#。并发&#xff08;concurrent&#xff09;&#xff1a;即使对于单核CPU&#xff0c;我们也会采用多线程等技术提高service的并…

Anaconda创建python虚拟环境

在创建虚拟环境之前首先我们需要打开命令终端&#xff1a;Win R 输入cmd 或者直接打开Anaconda Prompt&#xff08;Anaconda&#xff09; pycharm下载历史版本地址&#xff1a;https://www.jetbrains.com/pycharm/download/other.html Anaconda下载历史版本地址&#xff1a;ht…

vue2实践揭秘pdf_《Vue2.0 实践揭秘》终于出版啦!

不知不觉间在园子开博都两年多了&#xff0c;最近一些园友问最近去哪了为何都没有新的文章了。最近确实发生了很多的事&#xff0c;一是忙工作二就是忙着写书。这还得多些园子的小编&#xff0c;自两年前发表的“架构师修炼”系列的文章后被出版社相出让我将这个主题写成书&…

[蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索

题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5-> 7-> 8-&g…

这些年我对微服务的理解

Monolith、SOA、DDD、The two-pizza rule、分库分表这些概念跟微服务有啥关系&#xff0c;你知道吗&#xff1f;这篇文章记录我的理解&#xff0c;分享给大家。微服务&#xff08;micro service&#xff09;&#xff0c;个人感觉也就近几年才吵起来的概念&#xff0c;记得退回去…

梯度下降与线性回归

对于代价函数&#xff1a; loss∑i(y^−yi)2loss\sum_i{(\hat{y}-y_i)}^2loss∑i​(y^​−yi​)2 loss∑i(w∗xib−yi)2loss\sum_i{(w*x_ib-y_i)}^2loss∑i​(w∗xi​b−yi​)2 最常见的代价函数&#xff1a;均方差代价函数&#xff08;Mean-Square Error&#xff0c;MSE&…

fastreport字体自适应_FastReport 自动换行与行高自适应及自动增加空行

设定后即可自动换行及行高自适应。版本号5.6.21、masterData&#xff1a;属性值&#xff1a;stretched 为True2、Memo设定wordwrap为True ,stretchMode:smMaxHeightFastReport自动增加空行1、在masterdata下增加child&#xff1b;2、在code编写如下代码varPageLine: integer;//…

.NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(下)...

21 | 中间件&#xff1a;掌控请求处理过程的关键如果在 Map 的时候逻辑复杂一点&#xff0c;不仅仅判断它的 URL 地址&#xff0c;而且要做特殊的判断的话&#xff0c;可以这么做把判断逻辑变成一个委托我们要判断当我们的请求地址包含 abc 的时候&#xff0c;输出 new abcapp.…

英伟达3060Ti安装GPU版本TensorFlow2.X和Pytorch

查看Python与TensorFlow对应版本 安装GPU版本的TensorFlow的时候&#xff0c;我们需要考虑的一个问题是Python版本与TensorFlow版本的对应关系&#xff0c;可以参考下面这个链接&#xff1a; Python对应TensorFlow CPU版本 GPU版本 查看显卡驱动对应的CUDA版本并且下载安装 …

石子合并-区间dp

设有N堆石子排成一排&#xff0c;其编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;N。 每堆石子有一定的质量&#xff0c;可以用一个整数来描述&#xff0c;现在要将这N堆石子合并成为一堆。 每次只能合并相邻的两堆&#xff0c;合并的代价为这两堆石子的质量…

cesium米转换经纬度_cesium 笛卡尔坐标(单位:米) 与 经纬度(单位:弧度/度) 之间的转换。...

this.model.readyPromise.then(function (tileset) {//记录模型原始的中心点var boundingSphere tileset.boundingSphere;that.boundingSphere boundingSphere;//模型原始的中心点。此处是笛卡尔坐标&#xff0c;单位&#xff1a;米。var position boundingSphere.center;//…

200行代码,7个对象——让你了解ASP.NET Core框架的本质[3.x版]

2019年1月19日&#xff0c;微软技术&#xff08;苏州&#xff09;俱乐部成立&#xff0c;我受邀在成立大会上作了一个名为《ASP.NET Core框架揭秘》的分享。在此次分享中&#xff0c;我按照ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架&…

逻辑回归(二)

逻辑回归 在学习逻辑回归之前我们先回顾一下线性回归。线性回归解决的是回归问题&#xff0c;简单来说就是&#xff0c;我们需要找到一个函数&#xff0c;这个函数需要尽可能的拟合所有训练集的样本点。 逻辑回归解决的是分类问题&#xff0c;它的目标是找到一个函数&#x…