专栏首页码农阿宇ASP.NET Core轻松入门之Middleware管道模型

ASP.NET Core轻松入门之Middleware管道模型

Middleware指的是微软的的asp.net core的管道模型。其原理可以用微软官方的下图展示:

原理如上图,随着Request的发起,HttpContext会经历多个管道处理(图中的箭头游走方向)每经过一个处理,HttpContext内都会被加入一些东西或者被做一些修改,在每个管道处理完成后,随着Next()传到下一个管道处理。

下面 ,我们在ASP.Net Core应用程序中添加我们自己构建的管道。

首先,我们新建一个空白的ASP.NET Core应用程序。

然后,打开Startup.cs  ,在congfig方法内加入一些代码。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("1");
                await next.Invoke();
            });
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }

加入了红色部分后,我们看看网页如何显示。

在hello world 之前输出了1,那么我们把next删除之后,看看会怎样

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

结果如下,只输出一个1

所以说,如果没有next方法,是不会调用下一个管道的。

还有一种使用方法是这样的。

因为我们看到,use方法可以传入一个RequestDelegate,返回也是一个RequestDelegate,所以我们可以写这么一个方法

  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("1");
                await next.Invoke();
            });

            app.Use((next) =>
            {
                return (context) =>
                {
                    context.Response.WriteAsync("2");
                    return next(context);
                };
            });
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }

可以看到 ,添加的代码,传入传出都是一个委托,如果这个函数看不懂的,请自行百度  lambda表达式和委托相关的知识。

输出,我们看到如下结果:

(把上文注释了的next方法记得恢复)

我们的asp.net core管道中,其实,还提供了路由方法(Map),其使用方法如下:

  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.Map("/test", appTest =>
            {
                appTest.Run(async (context) =>
                {
                    await context.Response.WriteAsync("this is tets Map");
                });
            });
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("1");
                await next.Invoke();
            });

            app.Use((next) =>
            {
                return (context) =>
                {
                    context.Response.WriteAsync("2");
                    return next(context);
                };
            });
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }

要注意得是Map方法要放在最后一个Next方法得前面,因为如果放在后面,会被截断不执行这个管道,你体会一下!

这是全部关于管道得介绍,有任何疑问欢迎大家来我的个人网站给我留言。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C# 找出泛型集合中的满足一定条件的元素 List.Wher()

    在学习的过程中,发现泛型集合List<T>有一个Where函数可以筛选出满足一定条件的元素,结合Lambda表达式使用特别方便,写出来与大家分享。 1.关于Fu...

    码农阿宇
  • C# MVC的一种高效分页的html方法

    首先创建一个html的扩展方法,这个方法是万能的,可以直接拿到您的项目中使用: //主要就是输出分页的超级链接的标签 //自定义分页Helpe...

    码农阿宇
  • Visio如何调整锁定图像大小

    在Visio中,比如模板中的UML类图,是不可调整大小的,这可能给我们设计图片带来了一些不便之处,如下图: ? 可以看到其边框是显示锁定状态无法修改的,当我们在...

    码农阿宇
  • CCNP学习笔记3-路由部分--OSPF

                ospf                rip                eigrp

    py3study
  • 教程 | Docker Compose + GPU + TensorFlow 所产生的奇妙火花

    选自 hackernoon 机器之心编译 参与:黄小天、路雪 Docker 有很多优势,但是在数据科学和深度学习方面,使用 Docker 也存在一些阻碍。本文介...

    机器之心
  • 半天学会Swift

    音视频_李超
  • Docker Compose + GPU + TensorFlow = Heart

    Docker是一个开源的应用容器引擎——越来越多的人将它用于开发和分发上。即时环境设置、平台独立应用、即时解决方案、更好的版本控制、简化维护。可以说Docker...

    AiTechYun
  • 人类行动检测和人机工程学风险评估的多任务学习方法 (CS CV)

    我们提出了一种基于图形多任务建模的长视频人体动作评价(HAE)新方法。以前在活动评估中的工作要么直接使用检测到的骨架计算度量,要么使用场景信息来回归活动分数。这...

    太子钟
  • Python虚拟环境介绍

    版权声明:本文为博主原创文章,转载请注明出处。 ...

    乐百川
  • 单元测试 - Tests和UITests (一) 业务测试

    假如我们今天去面试了,面试官问了一句“什么是单元测试?有没有使用?大概是针对那些情况进行单测的?单测意义从你实际使用中总结一下。”

    Mr.RisingSun

扫码关注云+社区

领取腾讯云代金券