13.在ASP.NET Core中配置中间件组件
这篇文章中,我们将一起学习在asp.net core中配置中间件组件,以便处理请求处理管道。在阅读这篇文章之前,麻烦大家先去看看,我前面写的一篇文章:asp.net core中间件组件。在这篇文章中,我们将一起学习下面几个内容:
- 怎样在asp.net core中配置中间件组件?
- 什么是asp.net core中的请求委托?
- 什么是asp.net core中的use和run方法?
- 什么是usedeveloperexceptionpage 中间件组件?
- 怎样使用扩展方法run,来配置中间件组件?
- 什么是扩展方法?
怎样在asp.net core中配置中间件组件
在前面的文章中,我们已经知道,我们需要在startup类文件中的startup类中的configure方法内,来配置中间件组件。我们打开之前创建的空模板的asp.net core项目,可以看到项目默认有一个configure方法:
什么是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扩展方法一起,来配置的中间件组件。
- usedeveloperexceptionpage() middleware component【usedeveloperexceptionpage中间件组件】
- middleware component registered using run() method【中间件组件使用run方法进行注册】
我们来详细讨论一下这两个中间件组件:
什么是usedeveloperexceptionpage中间件组件?
正如你在configure方法中看到的那样,只有应用程序当前托管环境是“development”,这个usedevelopexceptionpage中间件组件才会被注册。并且只有在开发模式下,发生了未处理的异常,这个usedevelopexception中间件组件才会执行。你可以把这个看成是报错直接显示成黄页的一个替换。在后面的文章中,我将会介绍使用这个usedevelopexceptionpage中间件组件的项目例子。
怎样使用run扩展方法来配置中间件组件?
另外一个注册中间件组件的方法就是使用run扩展方法。只要使用了run扩展方法注册中间件组件,那么这个被注册的中间件组件就称为终结中间件组件,意味着:它将不会调用请求处理管道中的下一个中间件组件了。这个中间件组件也就将仅仅只是打印出“hello world!”还有一点需要记住:这个中间件将会响应每一个即将来临的http请求。
第二个中间件组件是通过run扩展方法注册的。因为该组件是使用run扩展方法注册的,所以它将成为终结中间件,不会调用处理管道中的下一个中间件了。也就仅仅输出“hello world”。
我们通过iapplicationbuilder的实例(app),调用run方法,来向请求处理管道中注册中间件。下面是run方法的定义:
正如你所看到的run方法的定义,它是iapplicationbuilder接口的扩展方法。这也就是我们为啥能通过iacclicationbuilder的实例app调用run方法。如果你是第一次接触扩展方法,请先去学一下扩展方法。
上面的图片中,还可以发现,run方法还有一个requestdelegate委托的参数。下面是requestdelegate委托的定义:
上面的图片中,requestdelagate委托,有一个httpcontext类型的参数context.如果你没接触过过委托,也请先去学习。
我们已经知道,我们能在asp.net core中处理http请求和响应,是因为httpcontext对象。
在我们的例子中,我们通过lambda表达式,使用一个匿名的方法,传递请求委托。并且将httpcontext对象作为输出参数传递给请求委托。如下图:
请注意:除了使用匿名的方法来传递请求委托,你还可以在单独的类中定义请求委托,并且在这里进行传递。这个我们后面会介绍的。
实例:
我们来讨论一下,使用run扩展方法,创建的中间件组件。看下面的代码:
现在我们在configure方法中,有了两个中间件组件。如果你运行项目,就会得到下面的输出结果:
getting response from 1st middleware
这个输出结果,是来自第一个中间件。原因是:当我们使用了run扩展方法注册中间件组件的时候,这个时候,这个中间件就称为了终结中间件,也就是不会再去调用下一个中间件了。
那么你现在肯定有疑问了,那么怎么来调用下一个中间件呢?答案就是:
现在运行的话,就会看到两个输出结果了。
理解这个use扩展方法
use扩展方法将内嵌的中间件委托加到了请求处理管道中,下面是定义:
这个方法,同样实现了iapplication接口,这也是你为啥可以使用iapplication实例调用这个方法了,正如你所看到的,这个use方法有两个参数,第一个参数就是httpcontext对象,第二个参数就是一个func委托参数,也就是一个泛型委托。它可以处理请求,或者调用请求管道中的下一个中间件。
好了,上面的所有,就是今天要将的内容,大家明白了么?下一篇文章,我将带领到家一起学习asp.net core请求处理管道。在这篇文章中,我努力的解释了,在asp.net core中如何配置中间件组件,以便处理请求处理管道。
上一篇: Spring中的设计模式:工厂方法模式
下一篇: java生态框架、中间件该有的都有了
推荐阅读
-
详解ASP.NET Core 在 JSON 文件中配置依赖注入
-
在Asp.Net或.Net Core中配置使用MarkDown富文本编辑器有开源模板代码(代码是.net core3.0版本)
-
在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)
-
13.在ASP.NET Core中配置中间件组件
-
详解在ASP.NET Core中如何编写合格的中间件
-
在ASP.NET Core中,静态类如何读取配置文件
-
在ASP.NET Core中编写合格的中间件
-
详解ASP.NET Core 在 JSON 文件中配置依赖注入
-
在Asp.Net或.Net Core中配置使用MarkDown富文本编辑器有开源模板代码(代码是.net core3.0版本)
-
在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)