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方法:

什么是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”。

我们通过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中如何配置中间件组件,以便处理请求处理管道。

(0)

相关推荐

  • 使用cmd命令行(.NET Core CLI)来启动ASP.NET Core 应用程序的多个实例

    本章主要和大家分享下如何使用cmd命令行(.NET Core CLI)来启动ASP.NET Core 应用程序的多个实例,以此来模拟集群. .NET Core 命令行接口 (CLI) 工具是用于开发. ...

  • ASP.Net 管道模型 VS Asp.Net Core 管道 总结

    dotNET跨平台 今天 1 管道模型 1 Asp.Net Web Form管道 请求进入Asp.Net工作进程后,由进程创建HttpWorkRequest对象,封装此次请求有关的所有信息,然后进入H ...

  • ASP.NET Core 中间件详解及项目实战

    WEB前端开发社区 昨天 前言 本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章对你有用的话,不妨点个[ ...

  • ASP.NET CORE 管道模型及中间件使用解读

    说到ASP.NET CORE 管道模型不得不先来看看之前的ASP.NET 的管道模型,两者差异很大,.NET CORE 3.1 后完全重新设计了框架的底层,.net core 3.1 的管道模型更加灵 ...

  • 14.ASP.NET Core请求处理管道

    在这篇文章中,我将通过一个示例,来讲解ASP.NET Core中的请求处理管道.在这篇文章中,我们将讨论下面几个点: 理解ASP.NET Core请求处理管道 怎样在ASP.NET中创建并注册多个中间 ...

  • NET问答: 如何给 ASP.NET Core 配置指定端口 ?

    今天 以下文章来源于NET技术问答 ,作者Stackoverflow NET技术问答精选 StackOverFlow 上的.NET 相关技术问题解答 咨询区 Drew Noakes: 我是 ASP.N ...

  • .NET Core技术研究-中间件的由来和使用

    今天 前言 我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响 ...

  • Asp.Net Core安全防护-客户端IP白名单限制

    前言 本篇展示了如何在ASP.NET Core应用程序中设置IP白名单验证的2种方式. 你可以使用以下2种方式: 用于检查每个请求的远程 IP 地址的中间件. MVC 操作筛选器,用于检查针对特定控制 ...

  • 3.介绍ASP.NET Core框架

    介绍ASP.NET Core框架 在这篇文章中,我将要向你们简短介绍一下ASP.NET Core 框架.当今社会,当提到软件开发,每个人都是讨论着开源以及跨平台开发.总所周知,微软是以它的基于Wind ...

  • ASP.NET Core 中的配置

    背景 ASP.NET Core 提供了一个灵活可扩展,基于键值的配置系统. 但是配置系统独立于ASP.NET Core是Microsoft.Extensions 类库的部分. 它可以用于任何类型的应用 ...

  • 如何解决在ASP.NET Core中找不到图像时设置默认图像

    dotNET跨平台 今天 以下文章来源于UP技术控 ,作者conan5566 UP技术控不止IT 还有生活 背景 web上如果图片不存在一般是打xx,这时候一般都是会设置默认的图片代替.现在用中间件的 ...

  • 一图看懂 ASP.NET Core 中的服务生命周期

    dotNET跨平台 今天 以下文章来源于技术译站 ,作者技术译民 翻译自 Waqas Anwar 2020年11月8日的文章 <ASP.NET Core Service Lifetimes (I ...

  • 如何在 ASP.Net Core 中使用 HTTP.sys WebServer ?

    dotNET跨平台 今天 以下文章来源于码农读书 ,作者码农读书 ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,大家都知道 Kestrel 是 A ...

  • Asp.Net Core 中IdentityServer4 授权中心之应用实战

    一.前言 查阅了大多数相关资料,查阅到的IdentityServer4 的相关文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应 ...

  • 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    dotNET跨平台 今天 以下文章来源于码农读书 ,作者码农读书 ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP ...

  • Asp.Net Core 中IdentityServer4 授权原理及刷新Token的应用

    一.前言 上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权 ...

  • Asp.Net Core 3.1学习-使用ASP.NET Core中的RazorPages(2)

    Asp.Net Core 3.1学习-使用ASP.NET Core中的RazorPages(2)

  • 如何在 ASP.NET Core 中写出更干净的 Controller

    你可以遵循一些最佳实践来写出更干净的 Controller,一般我们称这种方法写出来的 Controller 为瘦Controller,瘦 Controller 的好处在于拥有更少的代码,更加单一的职 ...