.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。

原文地址:http://www.cnblogs.com/durow/p/5752055.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2小时学习Spring Boot 2019版本 代码一样推送至github上面去

简介&#xff1a;《2小时学习Spring Boot》后续进阶课程&#xff0c;主要讲述了Spring Boot针对Web方面的相关技巧 讲师实战课程《Spring Boot微信点餐系统》 http://coding.imooc.com/class/117.html 《Spring Cloud微服务实战》 http://coding.imooc.com/class/187.html 均已…

认识JVM--第一篇-对象分配&回收算法

转载自 认识JVM--第一篇-对象分配&回收算法本来标题党想写成《深入JVM》&#xff0c;不过不太敢写&#xff0c;我想一小篇博客我想还不足以说明JVM&#xff0c;在本文中&#xff0c;会就我所知给大家介绍JVM的很多内部知识&#xff0c;概念会相对较粗&#xff0c;因为太细…

JAVASE阶段流程图

转载于https://blog.csdn.net/czc514/article/details/106057366

hibernate配置详情3(Dept)

package org.hibernate_one.entity;import java.io.Serializable;/** 部门实体类* 符合javabean规范* 1.公共类* 2.具有公共的无参的构造方法* 3.私有属性* 4.getter setter方法* 5.实现序列化接口Serializable java.io*/public class Dept implements Serializable {//部门编…

学生上课睡觉班主任怎么处理_【师问师答】学生上课说话,点名批评还嘴怎么办?...

案例我是一个初二的英语老师&#xff0c;昨天上课一男生一直在说话。我点了他名字之后毫不畏惧&#xff0c;仍然接着说话。后来我让他站起来&#xff0c;他说他腰痛不能站。又继续和同桌说话&#xff0c;我火大啊&#xff0c;让他站出去说完了再进来。他就在座位上嘀嘀咕咕&…

.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

0x00 为什么要引入扩展方法 有的中间件功能比较简单&#xff0c;有的则比较复杂&#xff0c;并且依赖其它组件。除了直接用ApplicationBuilder的Use()方法注册中间件外&#xff0c;还可以使用ApplicationBuilder的扩展方法UseMiddleware()注册中间件。这种情况下可以注册类型&a…

Spring Boot进阶之Web进阶 代码推送的github上面去

还是搜狗的输入法比较好 Exception.class 上面开不见的部分是这里的 代码上次github上面去保存起来 https://github.com/yangjiabinylg/girl2 https://github.com/yangjiabinylg/girl2 全部做完了 代码提交到github 上面去了

JVM初探- 使用堆外内存减少Full GC

转载自 JVM初探- 使用堆外内存减少Full GC问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao、LinkedIn、Vdian), 虽然CMS可与用户线程并发GC以降低STW时间, 但它也并非十分完美, 尤其是当出现Concurrent Mode Failure由并行GC转入串行时, 将导致非常长时间的…

快捷生成---QQ点击联系我的方法

第一步 第二步 第三步 把uin2764954910 p2:2764954910:53 换成自己的QQ号 运行 完结撒花

.NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

0x00 问题的产生 管道是.NET Core中非常关键的一个概念&#xff0c;很多重要的组件都以中间件的形式存在&#xff0c;包括权限管理、会话管理、路由等。所以搞明白中间件是如何注册并最终构建成管道的很重要。园子里很多先驱早已经开始了这方面的研究学习&#xff0c;也写了很多…

语言 高速公路超速处罚_重磅!全国高速将统一限速,这4种超速不再扣分罚款!【饮茶论道】...

在高速开车&#xff0c;经常会经历“断崖式降速”和“忽高忽低式限速”。相信不少吃了罚单的司机感受都是&#xff1a;哑巴吃黄连——有苦说不出……现在&#xff0c;重磅消息来啦&#xff01;在高速公路上行驶前方没有任何障碍导航却突然提醒你“当前道路限速60km/h&#xff0…

SpringBoot开发常用技术整合 代码上传至github上面去

简介&#xff1a;本课程通过详细的对springboot的各个技能点逐一介绍与演示&#xff0c;可以很迅速的熟悉整个springboot框架体系&#xff0c;并且与springmvc有效的进行对比&#xff0c;理解异同&#xff0c;这样对于后续的springboot开发会非常迅速。同时课程中会针对不同的技…

Java中对象的三种状态

转载自 Java中对象的三种状态Java中的对象的三种状态是和垃圾回收紧密相关的&#xff0c;因此有必要深究。 状态一&#xff1a;可触及态&#xff1a;从根节点开始&#xff0c;可以搜索到这个对象&#xff0c;也就是可以访问到这个对象&#xff0c;也有人将其称为可达状态。 状…

HTML5(笔记)

什么是HTML Hyper Text Markup Language(超文本标记语言) 超文本包括&#xff1a;文字&#xff0c;图片&#xff0c;音频&#xff0c;视频&#xff0c;动画等 w3c标准 WOrld Wide Web Consortium(万维网联盟) 成立于1994年&#xff0c;Web技术领域最权威和具影响力的国际中…

训练测试数据大小不一致_三步学会训练狗狗不随地大小便

训练狗狗在规定的地点大小便是非常重要的训练&#xff0c;它决定了你的屋子和院子能否干净整洁。如果是室内训练&#xff0c;我要先告诉你一些相关的训练禁忌。首先&#xff0c;当狗狗在家里排便之后才对狗狗做出惩罚&#xff0c;是最普遍的一个训练错误&#xff0c;这只会使问…

使用实体框架、Dapper和Chain的仓储模式实现策略

关键要点&#xff1a; Dapper这类微ORM&#xff08;Micro-ORM&#xff09;虽然提供了最好的性能&#xff0c;但也需要去做最多的工作。在无需复杂对象图时&#xff0c;Chain这类Fluent ORM更易于使用。对实体框架&#xff08;Entity Framework&#xff09;做大量的工作后&#…

JVM-对象的存活与死亡

转载自 JVM-对象的存活与死亡 当Java虚拟机进行垃圾收集的时候&#xff0c;那么它必须要先判断对象&#xff0c;是否还存活&#xff0c;如果存活就不能对它进行回收。所以判断一个对象是否存活是Java虚拟机必须要实现的。1.对象是否存活  1&#xff09;引用计数器&#xff1…

SpringBoot+MyBatis搭建迷你小程序

简介&#xff1a;用Spring Boot框架大大简化了新Spring应用的初始搭建以及开发过程&#xff0c;在开发人员中越来越受到欢迎。微信小程序作为目前炙手可热的应用&#xff0c;很有可能在未来占据轻应用的市场。本门课程的主要目的是将两者结合起来&#xff0c;同时希望作为入门翔…

蓝桥杯JAVA省赛2013-----B------3(振兴中华)

【解析】&#xff1a;将格子中的字存放到一个二维数组中&#xff0c;使用回溯法依次进行遍历&#xff0c; 符合条件的1&#xff0c;最后求出总和 【答案】&#xff1a;35 从我做起振 (0, 0) (0, 1) (0, 2) (0, 3) (0, 4) 我做起振兴 (1, 0) (1, 1) (1, 2) (1, 3) (1, 4) 做起…

python变量后面加星号_Python基础找茬系列20--python函数的秘密

一、小试牛刀二、函数的定义def 函数名(参数列表): 函数体【1】函数的关键词&#xff1a;是def&#xff0c;不是del&#xff0c;也不是function【2】函数的名称&#xff1a;不能使用关键词作为函数的名称&#xff0c;允许使用内置函数名作为函数名称&#xff0c;这会覆盖内置函…