当前位置: 代码网 > it编程>编程语言>Asp.net > ASP.NET Core基础之中间件

ASP.NET Core基础之中间件

2024年05月19日 Asp.net 我要评论
什么是asp.net core middleware?asp.net core中间件组件是被组装到应用程序管道中以处理http请求和响应的软件组件(从技术上来说,组件只是c#类)。asp.net co

什么是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应用程序中使用中间件组件的一些示例如下:

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

中间件组件是我们通常用于在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基础之中间件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com