返回顶部
首页 > 资讯 > 精选 >ASP.NET Core中间件与管道的概念是什么
  • 482
分享到

ASP.NET Core中间件与管道的概念是什么

2023-06-26 05:06:18 482人浏览 薄情痞子
摘要

今天小编给大家分享一下asp.net Core中间件与管道的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧

今天小编给大家分享一下asp.net Core中间件与管道的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

ASP.net core中,针对Http请求采用pipeline也就是通常说的管道方式来处理,而管道容器内可以挂载很多中间件(处理逻辑)“串联”来处理HTTP请求,每一个中间件都有权决定是否需要执行下一个中间件,或者直接做出响应。这样的机制使得HTTP请求能够很好的被层层处理和控制,并且层次清晰处理起来甚是方便。 示意图如下:

ASP.NET Core中间件与管道的概念是什么

为了再次说明管道和中间件的概念,举一个官方给出的权限验证的例子,中间件A,B分别按顺序挂载在管道容器中,A为权限验证中间件,只有通过A的权限验证才能执行B,如果没有通过A的验证,A有权中断管道处理直接返回相应的错误提示例如401等。这样必须由上一节点来调用的串行递归执行方式就是pipeline,而每一个节点就是中间件或者叫中间组件。现在我们来看看如何在ASP.net core中使用中间件和管理自己的HTTP管道

环境配置与Startup

在了解中间件之前我们需要先知道Startup这个类具体运作方式,我们以下面这段代码为例:

    /// <summary>    /// WEB宿主的入口类    /// </summary>    public class Startup    {        //加入服务项到容器, 这个方法将会被runtime调用        public void ConfigureServices(IServiceCollection services)        {        }                /// <summary>        /// 配置HTTP请求管道        /// </summary>        /// <param name="app">被用于构建应用程序的请求管道 只可以在Startup中的Configure方法里使用</param>        /// <param name="env">提供了访问应用程序属性,如环境变量</param>        /// <param name="loggerFactory">提供了创建日志的机制</param>        public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory)        {            loggerFactory.AddConsole();                         if (env.IsDevelopment()) //根据配置的环境为开发环境,则会配置抛出异常错误界面            {                app.UseDeveloperExceptionPage();  //抛出详细的异常错误界面            }            //管道断路            app.Run(async (context) =>            {                await context.Response.WriteAsync("Hello World!");            });        }    }

可以看到 Startup.cs 内有两个方法,一个是用来配置接口服务到管道容器中的ConfigureServices, 一个是用来配置管道中间件的Configure。

为什么必须是这两个方法名?

其实这两个方法名并不是规定死的,但也不是任意规定的,他是根据容器的环境变量来判断的,这里先给出官方文档《多环境下工作》。

我们可以在文档中了解到,Core使用“ASPnetcore_ENVIRONMENT”字段来描述当前运行环境名称这就是上文中提到的环境配置,官方预设了3个环境名分别是Development(开发环境), Staging(测试环境), Production(生产环境),如果您使用的是vscode您可以在.vscode文件夹下的launch.JSON中找到“ASPNETCORE_ENVIRONMENT”字段,可以发现默认情况下是Development,那说这些到底有什么用呢?

ASP.NET Core中间件与管道的概念是什么

在Startup中规定,配置服务和中间件两个方法可以根据环境名称来命名和选择调用,命名规则为ConfigureServices{ENVIRONMENT}和Configure{ENVIRONMENT}。如ASPNETCORE_ENVIRONMENT = “Development” 则ConfigureServices和Configure 可以写成ConfigureServicesDevelopment 和ConfigureDevelopment ,其他也是如此。这样就可以通过配置ASPNETCORE_ENVIRONMENT 来决定该调用哪一个配置方法了。

ConfigureServices和Configure是什么环境下的呢?

ConfigureServices和Configure就好像Switch 语句中的 default一样的道理,如果没有找到任何符合环境名的方法名,就会执行调用这两个方法。如配置了Development,但却没有给出ConfigureServicesDevelopment ,这时就会执行ConfigureServices,如果都没有就会抛出异常。

必须设置成预设环境名吗?

环境名配置的参数名不必是预设值,你可以自己写一个,比如LogEnv等等。

接下来我们看一下实现的代码:

     /// <summary>    /// web宿主的入口类    /// </summary>    public class Startup    {        //加入服务项到容器, 这个方法将会被runtime调用        public void ConfigureServices(IServiceCollection services)        {        }        /// <summary>        /// Log环境下配置HTTP请求管道        /// </summary>        /// <param name="app"></param>        public void ConfigureLogHelp(IApplicationBuilder app){            app.Run(async (context) =>            {                 await context.Response.WriteAsync("Hello World - ConfigureLogHelp");            });        }            /// <summary>        /// 开发环境下配置HTTP请求管道        /// </summary>        /// <param name="app"></param>        public void ConfigureDevelopment(IApplicationBuilder app){            app.Run(async (context) =>            {                 await context.Response.WriteAsync("Hello World - ConfigureDevelopment");            });        }                    /// <summary>        /// 默认情况下配置HTTP请求管道        /// </summary>        /// <param name="app">被用于构建应用程序的请求管道。只可以在 Startup 中的 Configure 方法里使用</param>        /// <param name="env">提供了访问应用程序属性,如环境变量</param>        /// <param name="loggerFactory">提供了创建日志的机制</param>        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)        {            //管道断路            app.Run(async (context) =>            {                await context.Response.WriteAsync("Hello World!");            });        }

当ASPNETCORE_ENVIRONMENT = “Development”

ASP.NET Core中间件与管道的概念是什么

当ASPNETCORE_ENVIRONMENT = “LogHelp”

ASP.NET Core中间件与管道的概念是什么

这样做的好处就是你可以写自己的测试配置而不会影响到其他人或者开发过程。当然环境的作用还在于前端应该引用什么样的CSSjs,关于这些我们之后在mvc的章节再来讨论, 想了解的博友可以看官方文档

管道配置与Startup

说完环境配置和Startup的关系,我们回来接着聊管道的事情,现在我们来说说Configure{ENVIRONMENT}一下Configure简称这个方法。

Configure这个方法是用于配置中间件到中管道容器(IApplicationBuilder),所以这个方法必须要包含一个IApplicationBuilder参数用来接受管道容器,方便开发者配置。当然他还可以接受其他的可选参数供开发者使用如下:

(注:下图来源于ASP.Net Core中文文档)

ASP.NET Core中间件与管道的概念是什么

需要提一下的是,刚刚我们上文中说的环境名在IHostingEnvironment中可以获取,对于预设值官方还做了判断封装,当然你可以重构它来封装自己的环境名判断。

HTTP管道容器由三个扩展的方法来控制中间件的路由、挂载等等,分别是Run, Map, User。

a.Run方法会使得可以使管道短路,顾名思义就是终结管道向下执行不会调用next()委托,所以Run方法最好放在管道的最后来执行,如下面的代码:

        /// <summary>        /// 开发环境下配置HTTP请求管道        /// </summary>        /// <param name="app"></param>        public void ConfigureDevelopment(IApplicationBuilder app){            app.Run(async (context) =>            {                 await context.Response.WriteAsync("Hello World - ConfigureDevelopment");            });            app.Run(async (context) =>            {                 await context.Response.WriteAsync("Hello World - ConfigureDevelopment 不会被执行");            });        }

执行结果:

ASP.NET Core中间件与管道的概念是什么

b.Use不会主动短路整个HTTP管道,但是也不会主动调用下一个中间件,必须自行调用await next.Invoke(); 如果不使用这个方法去调用下一个中间件那么Use此时的效果其实和Run是相同的,我们来看正常的代码:

        /// <summary>        /// 开发环境下配置HTTP请求管道        /// </summary>        /// <param name="app"></param>        public void ConfigureDevelopment(IApplicationBuilder app){            var order ="";            app.Use(async (context, next) =>            {                order = $"{order}|Use start";                await next.Invoke();                order = $"{order}|Use end";            });            app.Run(async context =>            {                await context.Response.WriteAsync($"{order}|Run ext");            });        }

执行结果如下:

ASP.NET Core中间件与管道的概念是什么

可以看到,Use end并没有被执行到,因为在调用下一个中间件时采用了Run,管道被终止了。

再来看看如果不显式调用next.Invoke()时的代码:

        /// <summary>        /// 开发环境下配置HTTP请求管道        /// </summary>        /// <param name="app"></param>        public void ConfigureDevelopment(IApplicationBuilder app){            var order ="";            app.Use(async (context, next) =>            {                order = $"{order}|Use start";                //去掉显示调用下一个中间件                //await next.Invoke();                order = $"{order}|Use end";                await context.Response.WriteAsync(order);            });            app.Run(async context =>            {                await context.Response.WriteAsync($"{order}|Run ext");            });        }

其结果如下:

ASP.NET Core中间件与管道的概念是什么

可以发现Run这个中间件并没有被执行,而只是单纯的执行了Use这个中间件。所以说 在不显式调用下一个中间件的情况下,效果和Run时一样的会使管道短路。

c.Map可以根据提供的URL来路由中间件,如下代码判断URL中访问"/test"时就会执行某个中间件逻辑:

        /// <summary>        /// 开发环境下配置HTTP请求管道        /// </summary>        /// <param name="app"></param>        public void ConfigureDevelopment(IApplicationBuilder app){            app.Map("/test", HandleMapTest);        }        /// <summary>        /// maptest 处理方法        /// </summary>        public void HandleMapTest(IApplicationBuilder app){            app.Run(async (context) =>            {                await context.Response.WriteAsync("HandleMapTest Handler");            });        }

结果如下:

ASP.NET Core中间件与管道的概念是什么

如果访问/test就会执行相应的中间件,反之则不会执行。

MapWhen是Map的一个条件判断的扩展方法,可以通过它来判断某个条件适合的时候执行某一个中间件,如:当携带某一个参数名称时,执行某一个中间件或者反之,代码如下:

        /// <summary>        /// 开发环境下配置HTTP请求管道        /// </summary>        /// <param name="app"></param>        public void ConfigureDevelopment(IApplicationBuilder app){           app.MapWhen(context => {                return context.Request.Query.ContainsKey("username");           }, HandleUserName);           app.Run(async context =>           {                await context.Response.WriteAsync("default ext");           });        }        /// <summary>        ///         /// </summary>        public void HandleUserName(IApplicationBuilder app){            app.Run(async context =>            {                await context.Response.WriteAsync("UserName Map");            });        }

结果如下:

ASP.NET Core中间件与管道的概念是什么

ASP.NET Core中间件与管道的概念是什么

以上就是“ASP.net Core中间件与管道的概念是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: ASP.NET Core中间件与管道的概念是什么

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

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

猜你喜欢
  • ASP.NET Core中间件与管道的概念是什么
    今天小编给大家分享一下ASP.NET Core中间件与管道的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-26
  • ASP.NET Core的中间件与管道介绍
    今天来讨论一个ASP.NET Core 很重要概念管道和中间件,在ASP.NET Core中,针对HTTP请求采用pipeline也就是通常说的管道方式来处理,而管道容器内可以挂载很...
    99+
    2024-04-02
  • ASP.NET Core中间件Middleware是什么
    本篇内容介绍了“ASP.NET Core中间件Middleware是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是中间件...
    99+
    2023-06-26
  • ASP.Net Core MVC中间件是什么
    本篇内容介绍了“ASP.Net Core MVC中间件是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!讲中间件, 其...
    99+
    2023-06-29
  • ASP.NET数据访问层的概念是什么
    本篇内容主要讲解“ASP.NET数据访问层的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET数据访问层的概念是什么”吧!如果不使用ASP.NET数据访问层,那么你的代码里会...
    99+
    2023-06-17
  • html5与css3的概念是什么
    今天小编给大家分享一下html5与css3的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2024-04-02
  • ping与TTL的概念是什么
    今天小编给大家分享一下ping与TTL的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。我们所知道的TTL更多的是关...
    99+
    2023-06-27
  • javascript插件的概念是什么
    本篇内容介绍了“javascript插件的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Vue组件的概念是什么
    本篇内容介绍了“Vue组件的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在多次使用到相同的函数和相同的HTML代码时,可以考虑抽...
    99+
    2023-06-20
  • TypeScript中函数与类的概念是什么
    这篇文章主要讲解了“TypeScript中函数与类的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“TypeScript中函数与类的概念是什么”吧!...
    99+
    2024-04-02
  • shell中xargs、-exec与管道间的区别是什么
    本文小编为大家详细介绍“shell中xargs、-exec与管道间的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“shell中xargs、-exec与管道间的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-27
  • jquery中$的概念是什么
    这篇文章主要讲解了“jquery中$的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery中$的概念是什么”吧! ...
    99+
    2024-04-02
  • C++时间的基本概念是什么
    本篇文章为大家展示了C++时间的基本概念是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++编程语言中对于时间的操作还是比较多的,能帮助程序开发人员在实际编程中实现各种对时间操作的需求。我们近...
    99+
    2023-06-17
  • Node.js中事件循环的概念是什么
    这篇文章主要讲解了“Node.js中事件循环的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js中事件循环的概念是什么”吧!什么是事件循...
    99+
    2024-04-02
  • Flex事件中的基本概念是什么
    这篇文章主要为大家展示了“Flex事件中的基本概念是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flex事件中的基本概念是什么”这篇文章吧。Flex简介Flex是响应RIA(富客户网络应用...
    99+
    2023-06-17
  • ASP.NET Core中间件用法与官方常用中间件的示例分析
    小编给大家分享一下ASP.NET Core中间件用法与官方常用中间件的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是中间件我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次...
    99+
    2023-06-29
  • .Net Core Ocelot超时、熔断、限流的概念是什么
    本篇内容介绍了“.Net Core Ocelot超时、熔断、限流的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本概念...
    99+
    2023-06-22
  • JavaScript事件流的概念是什么
    这篇文章主要介绍“JavaScript事件流的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript事件流的概念是什么”文章能帮助大家解决问题...
    99+
    2024-04-02
  • VB.NET Button控件的概念是什么
    今天就跟大家聊聊有关VB.NET Button控件的概念是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VB.NET编程语言中有很多控件供我们方便使用。这些控件的使用对于编程人员...
    99+
    2023-06-17
  • css文件margin的概念是什么
    这篇文章主要讲解了“css文件margin的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css文件margin的概念是什么”吧!css文件margin是一个用于定义元素周围空间的...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作