.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

0x00 为什么需要Map(MapWhen)扩展

如果业务逻辑比较简单的话,一条主管道就够了,确实用不到Map。不过当业务逻辑比较复杂的时候,有时候我们可能希望根据情况的不同使用特殊的一组中间件来处理HttpContext。这种情况下如果只用一条管道,处理起来会非常麻烦和混乱。此时就可以使用Map/MapWhen建立一个分支管道,当条件符合我们的设定时,由这个分支管道来处理HttpContext。使用Map/MapWhen添加分支管道是很容易的,只要提供合适跳转到分支管道的判断逻辑,以及分支管道的构建方法就可以了。

0x01 Map扩展的原理

前一篇文章中我们说过,中间件的注册和管道的构建都是通过ApplicationBuilder进行的。因此要构建一个分支管道,需要一个新的ApplicationBuilder,并用它来注册中间件,构建管道。为了在分支管道中也能够共享我们在当前ApplicationBuilder中注册的服务(或是说共享依赖注入容器,当然共享的并不止这些),在创建新的ApplicationBuilder时并不是直接new一个全新的,而是调用当前ApplicationBuilder的New方法在当前的基础上创建新的,共享了当前ApplicationBuilder的Properties(其中包含了依赖注入容器)。

在使用Map注册中间件时我们会传入一个Action<IApplicationBuilder>参数,它的作用就是,当我们创建了新的ApplicationBuilder后,使用这个方法对其进行各种设置,最重要的就是在新的ApplicationBuilder上注册分支管道的中间件。配置完成后调用分支ApplicationBuilder的Builder方法构建管道,并把第一个中间件保存下来作为分支管道的入口。

在使用Map注册中间件时传入了一个PathString参数,PathString对象我们可以简单地认为是string。它用于记录HttpContext.HttpRequest.Path中要匹配的区段(Segment)。这个字符串参数结尾不能是“/”。如果匹配成功则进入分支管道,匹配失则败继续当前管道。

新构建的管道和用于匹配的字符串保存为MapOptions对象,保存了Map规则和分支管道的入口。之后构建MapMiddleware对象,并把它的Invoke方法包装为RequestDelegate,使用当前ApplicationBuilder的Use方法注册中间件。

下面是Map扩展方法:

下面是MapMiddleware的Invoke方法

0x02 MapWhen扩展的原理

Map主要通过URL中的Path来判断是否需要进入分支管道,但有时候我们很可能会有别的需求,例如我想对所有Method为DELETE的请求用特殊管道处理。这时候就需要用MapWhen了。MapWhen是一种通用的Map,可以由使用者来决定什么时候进入分支管道什么时候不进入。可以说Map是MapWhen的一种情况,因为这种情况太常见了,所以官方实现了一个。这样看来MapWhen就很简单了,在Map中我们传入参数PathString来进行HttpRequest.Path的匹配,在MapWhen中我们传入Func<HttpContext,bool>参数,有我们自行指定,当返回true时进入分支管道,返回false则继续当前管道。

下面是MapWhen扩展方法:

下面是MapWhenMiddleware的Invoke方法:

0x03 顺便提一下Run扩展

还有一个注册中间件的扩展方法是Run,因为非常简单,所以在最后提一下。Run就是用Use注册一个中间件,最后不调用下一个中间件直接返回。所以使用Run扩展方法注册中间件永远都是直接返回的,后面的中间件都不会被调用。

0x04 写在最后

Map/MapWhen和Run都很简单就不写测试了。到此为止中间件的注册和管道的构建主题就写完了。刚开始是出于对中间件有些地方的迷惑开始的,搞明白了后本想着写一篇博客分享下自己的心得,没想到越写越多,一篇分成两篇,到现在写了三篇。我这些也只是写了些大概,很多细节没写到,有兴趣的可以去github上看一下代码,管道和中间件相关的都在这个仓库:https://github.com/aspnet/HttpAbstractions。

时间: 2024-10-13 03:02:24

.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法的相关文章

用UseMiddleware扩展方法注册中间件类

用UseMiddleware扩展方法注册中间件类 .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除了直接用ApplicationBuilder的Use()方法注册中间件外,还可以使用ApplicationBuilder的扩展方法UseMiddleware()注册中间件.这种情况下可以注册类型,这个方法会通过反射解析这个类型,并把它包装成Func<

ASP.NET Core - 中间件与管道(1)

今天来讨论一个ASP.NET Core 很重要概念管道和中间件,在ASP.NET Core中,针对HTTP请求采用pipeline也就是通常说的管道方式来处理,而管道容器内可以挂载很多中间件(处理逻辑)“串联”来处理HTTP请求,每一个中间件都有权决定是否需要执行下一个中间件,或者直接做出响应.这样的机制使得HTTP请求能够很好的被层层处理和控制,并且层次清晰处理起来甚是方便. 示意图如下: 为了再次说明管道和中间件的概念,举一个官方给出的权限验证的例子,中间件A,B分别按顺序挂载在管道容器中,

net core 中间件详解及项目实战

net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章对你有用的话,不妨点个[推荐]. 目录 中间件(Middleware)的作用 中间件的运行方式 中间件(Middleware)和过滤器(Filter)的区别 什么情况我们需要中间件 怎么样自定义自己的中间件 中间件(Middleware)的作用 我们知道,任何

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

前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章对你有用的话,不妨点个[推荐]. 目录 中间件(Middleware)的作用 中间件的运行方式 中间件(Middleware)和过滤器(Filter)的区别 什么情况我们需要中间件 怎么样自定义自己的中间件 中间件(Middleware)的作用 我们知道,任何的一个web框架都是把http请求封装成

ASP.NET Core 2.0 : 八.图说管道

本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道,从管道的配置.构建以及请求处理流程等方面做一下详细的研究.(ASP.NET Core系列目录) 一.概述 上文说到,请求是经过 Server监听=>处理成httpContext=>Application处理生成Response. 这个Application的类型RequestDelegate本质是 public delegate Task RequestDelegate (HttpContext context); ,即

ASP.NETCore学习记录(二) —— ASP.NET Core 中间件

ASP.NET Core 中间件 目录: IApplicationBuilder 什么是中间件 ? 使用 IApplicationBuilder 创建中间件 Run.Map 与 Use 方法 实战中间件 参考原文 我们知道在 ASP.NET 中,有一个面向切面的请求管道,由22个主要的事件构成,能够让我们在往预定的执行顺序里面添加自己的处理逻辑.一般采取两种方式:一种是直接在 Global.asax 中对应的方法中直接添加代码.一种是是在 web.config 中通过注册 HttpModule

ASP.NET Core 中间件基本用法

ASP.NET Core 中间件 ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件.中间件按照装配的先后顺序执行,并决定是否进入下一个组件.中间件管道的处理流程如下图(图片来源于官网): 管道式的处理方式,更加方便我们对程序进行扩展. 使用中间件 ASP.NET Core中间件模型是我们能够快捷的开发自己的中间件,完成对应用的扩展,我们先从一个简单的例子了解一下中间件的开发. Run 首先,我们创建一个ASP.NET Core 应用,在Startup

.Net Core中间件和过滤器实现错误日志记录

1.中间件的概念 ASP.NET Core的处理流程是一个管道,中间件是组装到应用程序管道中用来处理请求和响应的组件. 每个中间件可以: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的下一个组件之前和之后执行业务逻辑. 中间件是一个请求委托( public delegate Task RequestDelegate(HttpContext context) )的实例,所以中间件的本质就是一个方法,方法的参数是HttpContext,返回Task.传入的HttpContext参数包含

ASP.NET Core 中间件的几种实现方式

前言 ASP.NET Core 中 HTTP 管道使用中间件组合处理的方式, 换句人话来说, 对于写代码的人而言,一切皆中间件. 业务逻辑/数据访问/等等一切都需要以中间件的方式来呈现. 那么我们必须学会如何实现自定义中间件 这里划重点,必考 这里我们介绍下中间件的几种实现方式... 匿名函数 通常新建一个空的 ASP.NET Core Web Application,项目名字无所谓啦 在启动类里可以看到这么一句: // Startup.cs // ... app.Run(async (cont