每天学一点,每天积累一点,进步就不止一点点!PS:好记性不如烂笔头,学会总结,学会思考~~~ ----要飞翔,必须靠自己!

灰太狼的梦想

好记性不如烂笔头,学会总结,学会思考~~~

13.在ASP.NET Core中配置中间件组件

        这篇文章中,我们将一起学习在ASP.NET Core中配置中间件组件,以便处理请求处理管道。在阅读这篇文章之前,麻烦大家先去看看,我前面写的一篇文章:ASP.NET Core中间件组件。在这篇文章中,我们将一起学习下面几个内容:

  1. 怎样在ASP.NET Core中配置中间件组件?
  2. 什么是ASP.NET Core中的请求委托?
  3. 什么是ASP.NET Core中的Use和Run方法?
  4. 什么是UseDeveloperExceptionPage 中间件组件?
  5. 怎样使用扩展方法Run,来配置中间件组件?
  6. 什么是扩展方法?

怎样在ASP.NET Core中配置中间件组件

在前面的文章中,我们已经知道,我们需要在Startup类文件中的Startup类中的Configure方法内,来配置中间件组件。我们打开之前创建的空模板的ASP.NET Core项目,可以看到项目默认有一个Configure方法:

image

什么是ASP.NET Core中的请求委托?

          在ASP.NET Core中,请求委托被用来构建请求管道,也就是请求委托用来处理每一个即将从客户端发来的请求。在ASP.NET Core中,你可以使用Run、Map、以及Use扩展方法来配置请求委托。你可以使用,匿名的内联方法,来指定一个请求委托(这叫做内联中间件),或者你可以使用一个可以重复使用的类,来指定请求委托。这些可以重用的类和内联的匿名方法被称为中间件或者中间件组件。每一个请求处理管道中的中间件组件,就是用来触发管道中的下一个组件,或者不触发下一个中间件组件,这成为中间件短路。

什么是ASP.NET Core中的Use和Run方法?

        在ASP.NET Core中,你可以使用“Use”和”Run”扩展方法,来注册内联中间件组件到请求处理管道中。“Run”扩展方法允许我们添加终结中间件(终结中间件不会再去调用请求处理管道中的下一个中间件。)另外一方面,“Use”扩展方法添加的中间件,会去调用请求管道中的下一个中间件。

        如果你去观察Configure方法,你就会发现ASP.NET Core 是通过IApplicationBuilder接口的实例,和Use以及Run扩展方法一起,来配置的中间件组件。

  1. UseDeveloperExceptionPage() Middleware Component【UseDeveloperExceptionPage中间件组件
  2. Middleware Component Registered using Run() method【中间件组件使用Run方法进行注册】

我们来详细讨论一下这两个中间件组件:

什么是UseDeveloperExceptionPage中间件组件?

        正如你在Configure方法中看到的那样,只有应用程序当前托管环境是“development”,这个UseDevelopExceptionPage中间件组件才会被注册。并且只有在开发模式下,发生了未处理的异常,这个UseDevelopException中间件组件才会执行。你可以把这个看成是报错直接显示成黄页的一个替换。在后面的文章中,我将会介绍使用这个UseDevelopExceptionPage中间件组件的项目例子。

怎样使用Run扩展方法来配置中间件组件?

       另外一个注册中间件组件的方法就是使用Run扩展方法。只要使用了Run扩展方法注册中间件组件,那么这个被注册的中间件组件就称为终结中间件组件,意味着:它将不会调用请求处理管道中的下一个中间件组件了。这个中间件组件也就将仅仅只是打印出“Hello World!”还有一点需要记住:这个中间件将会响应每一个即将来临的HTTP请求。

第二个中间件组件是通过Run扩展方法注册的。因为该组件是使用Run扩展方法注册的,所以它将成为终结中间件,不会调用处理管道中的下一个中间件了。也就仅仅输出“Hello World”。

Configure Middleware Components in ASP.NET Core - Run method

我们通过IApplicationBuilder的实例(app),调用Run方法,来向请求处理管道中注册中间件。下面是Run方法的定义:

Configure Middleware Components in ASP.NET Core

正如你所看到的Run方法的定义,它是IApplicationBuilder接口的扩展方法。这也就是我们为啥能通过IAcclicationBuilder的实例app调用Run方法。如果你是第一次接触扩展方法,请先去学一下扩展方法。

上面的图片中,还可以发现,Run方法还有一个RequestDelegate委托的参数。下面是RequestDelegate委托的定义:

Request Delegate definition

上面的图片中,RequestDelagate委托,有一个HttpContext类型的参数context.如果你没接触过过委托,也请先去学习。

我们已经知道,我们能在ASP.NET Core中处理HTTP请求和响应,是因为HttpContext对象。

在我们的例子中,我们通过lambda表达式,使用一个匿名的方法,传递请求委托。并且将HTTPContext对象作为输出参数传递给请求委托。如下图:

Run Method in ASP.NET Core

请注意:除了使用匿名的方法来传递请求委托,你还可以在单独的类中定义请求委托,并且在这里进行传递。这个我们后面会介绍的。

实例:

我们来讨论一下,使用Run扩展方法,创建的中间件组件。看下面的代码:

image

现在我们在Configure方法中,有了两个中间件组件。如果你运行项目,就会得到下面的输出结果:

Getting Response from 1st Middleware

这个输出结果,是来自第一个中间件。原因是:当我们使用了Run扩展方法注册中间件组件的时候,这个时候,这个中间件就称为了终结中间件,也就是不会再去调用下一个中间件了。

那么你现在肯定有疑问了,那么怎么来调用下一个中间件呢?答案就是:

image

现在运行的话,就会看到两个输出结果了。

理解这个Use扩展方法

Use扩展方法将内嵌的中间件委托加到了请求处理管道中,下面是定义:

Use Extension method in ASP.NET Core

这个方法,同样实现了IApplication接口,这也是你为啥可以使用IApplication实例调用这个方法了,正如你所看到的,这个Use方法有两个参数,第一个参数就是HttpContext对象,第二个参数就是一个Func委托参数,也就是一个泛型委托。它可以处理请求,或者调用请求管道中的下一个中间件。

好了,上面的所有,就是今天要将的内容,大家明白了么?下一篇文章,我将带领到家一起学习ASP.NET Core请求处理管道。在这篇文章中,我努力的解释了,在ASP.NET Core中如何配置中间件组件,以便处理请求处理管道。

posted @ 2020-04-08 22:16  灰太狼的梦想  阅读(865)  评论(0编辑  收藏  举报