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中如何配置中间件组件,以便处理请求处理管道。
- Asp.Net Core- 配置组件详解
- ASP.Net Core 中使用Zookeeper搭建分布式环境中的配置中心系列一:使用Zookeeper.Net组件演示基本的操作
- ASP.NET Core 2.0 配置NLog日志组件
- ASP.NET Core 自动检查编译项目组件配置
- 玩转ASP.NET Core中的日志组件
- asp.net core2.0中网站发布的时候,怎么样才配置才可以使视图文件不被打包进去?
- 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json
- 2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」
- CZGL.Auth: ASP.NET Core Jwt角色授权快速配置库
- ASP.NET Core的配置(1):读取配置信息
- ASP.NET Core 中的那些认证中间件及一些重要知识点
- ASP.NET Core实现类库项目读取配置文件
- ASP.NET Core的配置(2):配置模型详解
- [转]ASP.NET Core 中的那些认证中间件及一些重要知识点
- ASP.NET Core应用错误处理之ExceptionHandlerMiddleware中间件呈现“定制化错误页面”
- [译]ASP.NET Core 2.0 视图组件
- 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter
- ASP.NET Core应用程序的参数配置及使用(转载)
- ASP.NET Core中使用GraphQL - 第二章 中间件
- 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?