广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NETCore基础之中间件
  • 354
分享到

ASP.NETCore基础之中间件

2024-04-02 19:04:59 354人浏览 安东尼
摘要

什么是ASP.net core Middleware? ASP.net core中间件组件是被组装到应用程序管道中以处理Http请求和响应的软件组件(从技术上来说,组件只是C#类)。

什么是ASP.net core Middleware?

ASP.net core中间件组件是被组装到应用程序管道中以处理Http请求和响应的软件组件(从技术上来说,组件只是C#类)。

ASP.Net Core应用程序中的每个中间件组件都执行以下任务。

  • 选择是否将 HTTP 请求传递给管道中的下一个组件。这可以通过在中间件中调用下一个 next() 方法实现。
  • 可以在管道中的下一个组件之前和之后执行工作。

asp.net Core中,已经有很多内置的中间件组件可供使用,您可以直接使用它们。 如果需要,还可以在ASP.net Core应用程序中创建自己的中间件组件。

您需要牢记的最重要的一点是,在ASP.NET Core中,给定的中间件组件应仅具有特定目的,即单一职责。

在ASP.NET Core应用程序中使用中间件组件的一些示例如下:

  • 用于验证用户身份的中间件
  • 中间件可用于记录请求和响应
  • 用于处理错误的中间件
  • 用于处理静态文件,例如图像,javascriptCSS文件的中间件
  • 用于在访问特定资源时授权用户的中间件

中间件组件是我们通常用于在ASP.NET Core应用程序中建立请求处理管道的组件。

如果您使用过.NET Framework的早期版本,那么您可能知道,我们使用HTTP处理程序和HTTP模块来设置请求处理管道。 正是此管道将确定如何处理HTTP请求和响应。

如何在ASP.NET Core应用程序中配置中间件组件?

在ASP.NET Core应用程序中,我们需要在Startup.cs文件中存在的Startup类的Configure()方法内配置中间件组件。

这是在应用程序启动时将要运行的类。 当我们使用空模板创建ASP.NET Core应用程序时,默认情况下,将使用Configure()方法创建Startup类,如下图所示。

因此,每当要在任何类型的.net核心应用程序中配置任何中间件组件时,都需要通过在IApplicationBuilder对象上调用Use方法在Startup类的Configure() 方法中对其进行配置。

如上图所示,configuration() 方法使用三个中间件组件设置了请求处理管道,如下所示。

  • **UseDeveloperExceptionPage() **
  • **UseRouting() **
  • UseEndpoints()

在了解以上三个内置的中间件组件之前。 首先让我们了解什么是中间件组件,以及这些中间件组件如何在ASP.NET Core应用程序中正常工作。

了解ASP.NET Core中的中间件组件

在ASP.NET Core应用程序中,中间件组件可以访问传入的HTTP请求和传出的HTTP响应。 因此,ASP.NET Core中的中间件组件可以:

  • 通过生成HTTP响应来处理传入的HTTP请求。
  • 处理传入的HTTP请求,对其进行修改,然后将其传递给下一个中间件组件
  • 处理传出的HTTP响应,进行修改,然后将其传递给下一个中间件组件或ASP.NET Core WEB服务器

为了更好地理解,请查看下图,该图显示了中间件组件如何在ASP.NET Core应用程序的请求处理管道中使用。

如上图所示,我们有一个日志记录中间件组件。 该组件仅记录请求时间,然后将请求传递到下一个中间件组件,即请求管道中的静态文件中间件组件,以进行进一步处理。

ASP.NET Core中的中间件组件也可以通过生成HTTP响应来处理HTTP请求。 ASP.NET Core中间件组件也可能决定不调用请求管道中的下一个中间件组件。 这个概念称为短路请求管道。

例如,我们有一个静态文件中间件组件。 并且,如果传入的HTTP请求来自某些静态文件,例如图像,CSS文件,JavaScript等,则此Static Files Middleware组件可以处理请求,然后通过不调用管道中的下一个组件来缩短请求管道 即mvc中间件组件。

正如上面讨论的,ASP.NET Core中间件组件可以访问管道中的HTTP请求和响应。 因此,中间件组件也可以处理传出响应。 例如,在我们的案例中,日志记录中间件组件可能会记录响应发送回客户端的时间。

ASP.NET Core应用程序中中间件组件的执行顺序是什么?

了解中间件组件的执行顺序非常重要。 ASP.NET Core中间件组件的执行顺序与添加到管道中的顺序相同。 因此,在将中间件组件添加到请求处理管道时,我们需要小心。

根据应用程序的业务需求,您可以添加任意数量的中间件组件。

例如,如果您要开发具有某些静态html页面和图像的静态Web应用程序,则在请求处理管道中可能仅需要“ StaticFiles”中间件组件。

但是,如果您正在开发安全的动态数据驱动的Web应用程序,则可能需要几个中间件组件,例如日志记录中间件,身份验证中间件,授权中间件,MVC中间件等。

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

在ASP.NET Core中,请求委托用于构建请求管道,即请求委托用于处理每个传入的HTTP请求。 在ASP.NET Core中,可以使用“运行”,“映射”和“使用”扩展方法配置请求委托。

您可以使用嵌入式匿名方法(称为嵌入式中间件)指定请求委托,也可以使用可重用的类指定请求委托。

这些可重用的类和嵌入式匿名方法称为中间件或中间件组件。 请求处理管道中的每个中间件组件负责调用管道中的下一个组件,或者通过不调用下一个中间件组件来使管道短路。

Use and Run方法的用途是什么?

在ASP.NET Core中,可以使用“Use”和“Run”扩展方法将内联中间件组件注册到请求处理管道中。

“Run”扩展方法使我们可以添加终止中间件(不会在请求处理管道中调用下一个中间件组件的中间件)。

另一方面,“Use”扩展方法使我们可以添加中间件组件,该中间件组件可以在请求处理管道中调用下一个中间件组件。

如果您观察Configure方法,那么您将看到它获得了IApplicationBuilder接口的一个实例,并将该实例与诸如Use and Run之类的扩展方法一起使用,它将配置中间件组件。

如您所见,在Configure方法中,使用IApplicationBuilder实例即app在请求处理管道中注册了三个中间件组件。 他们如下:

  • UseDeveloperExceptionPage()
  • UseRouting()
  • UseEndpoints()

UseDeveloperExceptionPage

如您所见,在Configure方法中,UseDeveloperExceptionPage() 中间件组件已注册到管道中,并且仅在将托管环境设置为“Development”时,该中间件组件才会出现。

当应用程序中发生未处理的异常时,该中间件组件将执行,并且由于它处于开发模式,因此它将向您显示代码的错误信息。 您也可以考虑将其替换为其它内容。

UseRouting

该中间件组件用于将端点路由中间件添加到请求处理管道,即它将URL(或传入的HTTP请求)映射到特定资源。

UseEndpoints

在此中间件中,将使用Map扩展方法来做出路由决策。 以下是UseEndpoints中间件组件的默认实现。 在MapGet扩展方法中,我们指定了URL模式,例如“ /”。 这仅表示域名。

因此,只有域名的任何请求都将由该中间件处理。

除了MapGet,您还可以使用Map方法,如下所示。

MapGet和Map方法有什么区别?

MapGet方法将处理GET HTTP请求,而Map方法将处理所有类型的HTTP请求,例如GET,POST,PUT和DELETE等。

如何使用Run() 扩展方法配置中间件组件?

首先我们需要了解如何使用“Run”扩展方法创建和配置自定义中间件组件。 首先,注释一下Configure方法中存在的所有代码。

注释现有代码后,将以下代码复制并粘贴到Configure方法中。 以下代码只是向应用程序的请求管道中添加了一个新的中间件组件,并仅打印了一条消息"My Name is Zhangsan"。

运行后,输出:

我们正在IApplicationBuilder实例(应用程序)上调用Run() 扩展方法,以将中间件组件注册到请求处理管道中。 以下是Run方法的定义:

从Run() 方法的定义中可以看到,该方法被实现为IApplicationBuilder接口的扩展方法。 这就是为什么我们能够使用IApplicationBuilder实例即app调用Run() 方法的原因。

您还可以从上图看到Run() 方法采用RequestDelegate类型的输入参数。 以下是RequestDelegate的定义。

从上图可以看到,RequestDelegate是一个采用HttpContext对象类型的输入参数的委托。

正如我们上面讨论的那样,ASP.NET Core应用程序中的中间件组件可以访问HTTP请求和响应,这是因为上面的HttpContext对象。

在示例中,我们使用lambda表达式将请求委托内联作为匿名方法传递给内联,此外,我们还将HTTPContext对象作为输入参数传递给请求委托。 下图显示了以上内容:

向该应用程序再添加一个中间件。

运行该应用程序,则将获得以下输出:

My Name is Zhangsan

输出来自第一个中间件组件。 原因是,当我们使用Run() 扩展方法注册中间件组件时,该组件成为终端组件,这意味着它不会在请求处理管道中调用下一个中间件组件。

使用Use扩展方法配置中间件组件

现在想到的问题是如何在请求处理管道中调用下一个组件,答案是使用Use扩展方法注册中间件组件,如下所示。

现在运行该应用程序,您将看到来自两个中间件组件的预期输出:

My Name is ZhangsanMy Name is LiSi

了解Use扩展方法

Use扩展方法将在行中定义的中间件委托添加到应用程序的请求管道中。 以下是Use扩展方法的定义:

此方法也实现为IApplicationBuilder接口上的扩展方法。 这就是为什么我们能够使用IApplicationBuilder实例调用此方法的原因。 从上面的定义可以看出,该方法采用两个输入参数。 第一个参数是HttpContext上下文对象,通过它可以访问HTTP请求和响应。 第二个参数是Func类型,即它是一个通用委托,可以处理请求或调用请求管道中的下一个中间件组件。

注意:如果要将请求从一个中间件发送到下一个中间件,则需要调用下一个方法。

到此这篇关于ASP.NET Core基础之中间件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: ASP.NETCore基础之中间件

本文链接: https://www.lsjlt.com/news/138582.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NETCore基础之中间件
    什么是ASP.NET Core Middleware? ASP.NET Core中间件组件是被组装到应用程序管道中以处理HTTP请求和响应的软件组件(从技术上来说,组件只是C#类)。...
    99+
    2022-11-13
  • ASP.NETCore基础之异常中间件
    了解异常中间件 首先,使用ASP.NET模板创建一个核心应用程序。默认情况下,ASP.NET核心应用程序只是返回应用程序未处理的异常的状态代码。如下所示,我们引发异常。 运行应用程...
    99+
    2022-11-13
  • ASP.NETCore基础之启动设置
    这一章,我们了解一下launchSettings.json的作用。 打开launchSettings.json 文件后,默认情况下,您将找到以下代码。 { "iisSettin...
    99+
    2022-11-13
  • ASP.NETCore基础之请求处理管道
    了解ASP.NET处理管道 为了理解ASP.NET Core中的请求处理管道概念,让我们修改Startup类的Configure()方法,如下所示。 在这里,我们将三个中间件组件注册...
    99+
    2022-11-13
  • ASP.NetCoreMVC基础系列之中间件
    上一节我们介绍了服务注册和基本的管道执行流程, 并且讲到了中间件, 这一节我们就来详细谈谈中间件这个东西 讲中间件, 其实就是讲Startup类里面的ConfigureService...
    99+
    2022-11-13
  • ASP.NETCore中间件
    目录1.前言2.使用中间件2.1 Run2.2 Use2.3 Map和MapWhen3.顺序4.编写中间件(重点)4.1中间件类4.2中间件扩展方法5.按每次请求创建依赖注入(DI)...
    99+
    2022-11-13
  • day 63 Django基础九之中间件
        本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏      我们在前面的课程中已经学会了...
    99+
    2023-01-31
    中间件 基础 day
  • 详解ASP.NETCore中间件Middleware
    本文为官方文档译文,官方文档现已非机器翻译 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/...
    99+
    2022-11-12
  • python基础之文件操作
    目录1、打开文件2、写入3、追加4、读文件5、文件拷贝6、tell()7、truncate(size)8、seek()1、打开文件 open()函数简介 : 打开文件使用open函数...
    99+
    2022-11-12
  • Java基础之文件概述
    目录一、基本概念和常识1.1 二进制思维1.2 文件类型1.3 文本文件的编码1.4 文件系统1.5 文件读写二、Java文件概述2.1 流2.2 装饰器设计模式 2.3 ...
    99+
    2022-11-12
  • Java 基础 之 条件语句
    转载于 : http://www.verejava.com/id=16992610131518 import java.util.Scanner;public class Statement...
    99+
    2023-06-02
  • ASP.NETCore实现中间件的几种方式
    前言 ASP.NET Core 中 HTTP 管道使用中间件组合处理的方式, 换句人话来说, 对于写代码的人而言,一切皆中间件. 业务逻辑/数据访问/等等一切都需要以中间件的方式来呈...
    99+
    2022-11-13
  • python文件基础之(文件操作)
        在之前学习了python的列表、元组、集合等知识,接下来将python的文件相关的知识做一总结和分析。一 open函数 在我们用word、excel、vim对文件操作时,肯定要先打开文件,同样在编程里面也是需要将文件打开,然后再对文...
    99+
    2023-01-31
    文件 操作 基础
  • Jetpack Compose基础组件之文字组件
    目录概述文字组件1.Text 文本2.Text的style文字样式3.maxLines参数4.fontFamily字体风格5.AnnotatedString多样式文字6.Select...
    99+
    2023-05-14
    Jetpack Compose文字组件 Jetpack Compose基础组件
  • python基础学习之组织文件
    目录一、Shutil 模块1.1 复制文件和文件夹1.2 移动文件和文件夹1.3 删除文件和文件夹二、遍历文件三、压缩文件3.1 创建和添加ZIP文件3.2 读取ZIP文件3.3 解...
    99+
    2022-11-12
  • Python基础之条件语句详解
    目录一、环境介绍二、条件判断介绍三、if语句的使用四、if判断的运算符五、学习小结一、环境介绍 Python版本Python 3.8.8 ( Pycharm版本2021.1.2 二、...
    99+
    2022-11-12
  • Python基础详解之邮件处理
    目录一、发送电子邮件二、发送纯文本格式的邮件三、发送HTML格式的邮件四、发送带附件的邮件五、发送图片的邮件六、接收电子邮件七、使用POP3协议下载邮件一、发送电子邮件 Python...
    99+
    2022-11-12
  • 三、python基础之条件和循环
    目录一.if语句1.1 功能1.2 语法1.2.1:单分支,单重条件判断1.2.2:单分支,多重条件判断1.2.3:if+else1.2.4:多分支if+elif+else1.2.5:if语句小结1.3 案例1.4 三元表达式二.while...
    99+
    2023-01-31
    条件 基础 python
  • Java基础之文件和目录操作
    目录一、前言二、构造方法三、文件元数据四、文件操作五、目录操作六、总结一、前言 文件和目录操作最终是与操作系统和文件系统相关的,不同系统的 实现是不一样的,但Java中的java.i...
    99+
    2022-11-12
  • Java基础学习之Swing事件监听
    目录一、初始代码架构二、需求分析2.1 写监听器2.2 发现问题2.3 使用匿名内部类优化代码2.4 优化完之后发现还是不是很优雅2.5 使用Lambda表达式再优化2.6 最终的代...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作