4.4管道Middleware简介「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。

管道流

  了解管道流机制,就能知道如何利用管道进行拦截,自定义封装等高级操作,所以学习管道流机制对我们编码有质的提高。那么管道数据是如何流通的呢?如下图所示,Request进入管道Middleware 1,叠加一层逻辑代码到HttpContext(切确说是HttpContext的Response对象),然后调用next()进入到下一个管道Middleware 2,依次递推,最后所有的逻辑代码叠加完毕后返回前端。

管道实践

  实现自定义管道有两种方法,使用IApplicationBuilder的Use和Run方法,他们的区别在下面会谈到。

app.Use方法

  这里先了解Use方法的第一个重载,如下图所示,他是一个类型为委托的中间件(middleware)。

  这个中间件同时携带一个next的RequestDelegate委托,可以实现调用下一个管道中间件,我们看下代码实践,如下所示,context从当前管道进来,处理后,通过next.Invoke()转移到下一个管道,完成一个管道的生命周期。

  其实我更喜欢截图,因为可以任意打标注,但是不方便拷贝,所以一起贴上代码吧。

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

  以上的用法,如果是新手可能不知其所以然,用没问题,但是内部是如何实现的?不知道!其实这里使用到了语言的高级特性委托,通过委托实现了开闭原则,也就是把管道的扩展开放出来,我们可以使用规定的app.Use方法,但是内部定义的委托参数类型,比如context,Fun<task>则对外屏蔽了实现。所以你看到的next.Invoke()已经封装了具体的实现了,对于使用者,其实可以不用去管那么多,拿来用即可。

  app.Use还有另外一个重载,如下图提示:这里Func传入一个RequestDelegate,返回一个RequestDelegate。不同于第一个重载,他没有next.Invoke()的调用,而是之间返回一个RequestDelegate给app进行处理。

  我们看下代码实现,外层红色框是传入的管道,内部绿色框是返回的管道。

app.Run

app.Run和app.Use不同之处在于,app.Use可以调用下一个中间件的管道,app.Run不会,我们演示一段代码。

    app.Use(async (context, next) =>
    {
        await context.Response.WriteAsync("<html><body>");
        await context.Response.WriteAsync("<div>Inside middleware defined using app.Use</div>");
        await next();
        await context.Response.WriteAsync("</body></html>");
    });

    app.Run(async context => {
       await context.Response.WriteAsync("<div>Inside middleware defined using app.Run</div>");
    });
    //该管道会不会被打印呢?
    app.Use(async (context, next) =>
    {
        await context.Response.WriteAsync("<html><body>");
        await context.Response.WriteAsync("<div>Another Middleware defined using app.Use</div>");
        await next();
        await context.Response.WriteAsync("</body></html>");
    });

如下图所示,我们看到Run后面定义的第二个Use没有打印出来,这是因为Run不会调用随后的管道导致的,所以我们一般习管性把Run方法放在所有管道的最后。

希望以上分享对你有帮助,我是张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注我的头条

原文地址:https://www.cnblogs.com/jackyfei/p/9939352.html

时间: 2024-08-29 22:17:26

4.4管道Middleware简介「深入浅出ASP.NET Core系列」的相关文章

目录导航「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 入门篇 1.1课程介绍「深入浅出ASP.NET Core系列」 1.2环境安装「深入浅出ASP.NET Core系列」 1.3创建项目「深入浅出ASP.NET Core系列」 1.4部署到IIS「深入浅出ASP.NET Core系列」 1.5准备CentOS和Nginx环境「深入浅出ASP.NET Core系列」 1.6部署到CentOS「深入浅出ASP.NET Core系列」 2.1命令行和JSON的配置「深

1.1专题介绍「深入浅出ASP.NET Core系列」

大家好,我是架构师张飞洪,专注于.NET平台十年有余. 工作之余喜欢阅读和写作,学习的内容包括数据结构/算法.网络技术.Linux系统原理.数据库技术原理,设计模式.前沿架构.微服务.容器技术等等…… 喜欢但不限于,Java.C.C++.Python.Javascript……Wait……不装了,因为我也还在学习的路上,愿你我一起终生学习. 定调 这里先给整个文章的系列定一个调调,起名深入浅出ASP.NET Core系列.深入的目的是希望能了解底层机制,浅出是为了学习能不让自己那么枯燥,给自己定个

4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. HTTP请求过程 这里展示整体的HTTP请求的过程,这里化繁为简,保留了主干流程: 从浏览器输入域名开始,这里忽略了建立TCP的3次握手,向服务器发起HTTPRequest请求,服务器接受到之后,会触发服务器对网站的动态解析,然后把生成的网页信息通过HTTPResponse返回给用户,内部包含HTML的Body,Head等信息,最后就是浏览器对这些HTML信息进行内部引擎渲染的过程了. ASP.NET Core

5.3Role和Claims授权「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. Role授权 这是一种Asp.Net常用的传统的授权方法,当我们在生成Token的时候,配置的ClaimTypes.Role为Admin,而ValuesController.cs是一个普通user(如下图所示),我们看下是否能访问成功? 我们把生成的Token通过JWT官网验证一下,发现多了一个"role":"admin" Postm

1.4部署到IIS「深入浅出ASP.NET Core系列」

很多人第一次在IIS中部署Asp.Net Core App的人都会遇到问题,会发现原来的部署方式无法运行Asp.Net Core App程序.其实大的方式没有多少变化,Asp.Net Core App为了做到跨平台,自带了一个轻量级的Web Server-Kestrel,那么要在IIS中部署Asp.Net Core App,就必须有一种新的机制来协调IIS与Kestrel Server之间的数据传递 Asp.Net Core的部署模式 与传统的Asp.Net程序不同,Asp.Net Core A

2.4配置的热更新「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 大家知道通常我们修改网站的配置文件比如,webconfig的时候,网站需要重启才能读取到最新的修改,所谓热更新就是网站无需重启,修改完配置文件,直接F5就可以看到效果如下图所示: 修改IOption为IOptionsSnapshot 上一节当中我们使用IOption来作为注入,这次我们改成IOptionSnapshot,注意如果我们是在Controller里也是一样的,见下图 修改为IOptionsSnapsh

1.3创建项目「深入浅出ASP.NET Core系列」

控制台创建项目 dotnet new --help 使用控制台采集项目,务必要熟练使用命令,--help是命令帮助的指明灯,在你无法google的时候,可以离线状态最快的帮助到你. 根据模板名称,我们可以创建各种模板,比如 dotnet new webaipdotnet new mvc…… 运行命令: dotnet run VS2017创建项目 都是创建,只是采集的方式不一样,殊途同归,前者适合ubuntu或者mac系统的操作方式,后者适合window底下的操作方式. Asp.net支持自寄宿,

2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」

命令行配置 1.新建控制台项目 2.nuget引入microsoft.aspnetcore.all 这里要注意版本号必须和dotnetcore兼容 3.编码 3.1.引入Microsoft.Extensions.Configuration; 3.2.AddCommandLine() 添加到命令行 3.3.AddInMemoryCollection 添加到内存当中 3.4.代替string.format的新语法糖:$"age:{configuration["age"]}&quo

2.2Bind建立配置文件和实体的映射「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 新建MVC项目 这次我们没有使用控制台项目,而是使用mvc来测试. 如下图所示,选择空的项目,建完后,记得把项目设置为启动项 新建配置文件appsettings.json和映射的实体类 这里有个坑,就是json和实体类必须要一一对应,假如json里命名为student,实体类为students,内部自动映射过程会报错,错误如下: Startup启动时注入配置类Configuration 这里就不贴上代码,代码在