分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

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

发布时间:2023-09-06 02:21责任编辑:白小东关键词:.NET

希望给你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年有余,人不堪其忧,吾不改其乐,谢谢您关注我的头条

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

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved