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跨平台或扫描二维码关注

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

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

    0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理.路由等.所以搞明白中间件是如何注册并最终构建成管道的很重要.园子里很多先 ...

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

    0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除了直接用ApplicationBuilder的Use()方法注册中间件外,还可以使用ApplicationB ...

  3. ASP.NET Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...

  4. 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?

    ASP.NET Core 的请求处理管道由一个Server和一组有序排列的中间件构成,前者仅仅完成基本的请求监听.接收和响应的工作,请求接收之后和响应之前的所有工作都交给注册的中间件来完成.ASP.N ...

  5. .net core 中间件管道底层剖析

    .net core 管道(Pipeline)是什么? 由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下图来看的话,.net core ...

  6. ASP.NET Core中间件初始化探究

    前言 在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,ASP.NET Core默认也为我们内置了许多的中间件,甚至有时候我们需要自定义中间件来帮我们处理一些请求管道 ...

  7. 【对比学习】koa.js、Gin与asp.net core——中间件

    web框架中间件对比 编程语言都有所不同,各个语言解决同一类问题而设计的框架,确有共通之处,毕竟是解决同一类问题,面临的挑战大致相同,比如身份验证,api授权等等,鄙人对node.js,golang, ...

  8. .net core HttpClient 使用之消息管道解析(二)

    一.前言 前面分享了 .net core HttpClient 使用之掉坑解析(一),今天来分享自定义消息处理HttpMessageHandler和PrimaryHttpMessageHandler ...

  9. ASP.NET Core 中间件分类

    ASP.NET Core 中间件的配置方法可以分为以上三种,对应的Helper方法分别是:Run(), Use(), Map(). Run(),使用Run调用中间件的时候,会直接返回一个响应,所以后续 ...

最新文章

  1. 【怎样写代码】工厂三兄弟之工厂方法模式(二):解决方案 I
  2. 信息化道路上,这两家龙头企业做了什么
  3. Python的Mixins机制
  4. 0228互联网新闻 | 抖音新推营销产品“抖店”;iTutorGroup牵手机器人索菲亚开创“新双师”模式...
  5. Xilinx产品与及开发工具2017
  6. Visual Studio 2017 15.9 Previews扩展C++调试功能
  7. 服务器专用影子系统,试试最牛X的影子系统!瞬间创建N个账号
  8. 结合使用Canvas API与History API——模拟绘图
  9. 异步处理Promise
  10. Overture2020免费下载直装版专业钢琴打谱软件(附序列号码)
  11. springboot教务评教系统毕业设计源码252116
  12. python入门教材 52pj_Micropython入门实操心得
  13. 利用OBS和手机摄像头录课(录屏/录像)时的方法与参数设置
  14. React Native开发之——Webstorm开发RN配置
  15. python绘制动漫人物图片女生可爱_绘画动漫人物图片女生唯美
  16. 数据说话:众安保险土豪式融资的背后
  17. 数仓知识12:PostgreSQL预写日志(WAL)和逻辑解码方案
  18. java double 运算经度丢失问题解决
  19. 什么是推力圆锥滚子轴承呢?
  20. 诚龙网刻报错_网刻工具|诚龙网维全自动PXE网刻工具V11.0下载(暂未上线)_预约_飞翔下载...

热门文章

  1. InfoQ —— 腾讯游戏大数据服务场景与应用
  2. ecs使用脚本安装oracle
  3. Heartbeat+httpd+NFS 实现高可用的Web服务器
  4. java 类的加载、连接和初始化
  5. js获取当前页面url网址等信息
  6. 递归与非递归法实现链表相加 CC150 V5 2.5题 java版
  7. Avalonia跨平台入门第十九篇之语音播放
  8. C#中类的override和virtual
  9. C#中Lock的秘密
  10. IdentityServer4系列 | 资源密码凭证模式