纵有疾风起
人生不言弃

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

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

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

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

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

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

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

然后,打开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!");            });        }

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

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

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

 

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

结果如下,只输出一个1

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

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

 

 

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

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

因为我们看到,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表达式和委托相关的知识。

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

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

(把上文注释了的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方法得前面,因为如果放在后面,会被截断不执行这个管道,你体会一下!

 

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

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

 

 

文章转载于:https://www.cnblogs.com/CoderAyu/p/8490123.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » ASP.NET Core轻松入门之Middleware管道模型
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录