.net 中间件的使用 Use,Run,Map,MapWhen,UseWhen

2023-11-15

.net 中间件的使用 Use,Run,Map,MapWhen,UseWhen

.net 提供了几种添加自定义中间件的方法Use,Run,Map,MapWhen,UseWhen

Use

app.Use(async (context, next) =>
{
  Console.WriteLine("use1");
  await next.Invoke();
  Console.WriteLine("use2");
});

Use方法最明显的特征是
传入的委托中含有一个委托参数,我们一般用next来接收这个委托参数,通过调用next.Invode()方法来调用下一个中间件,这样Use之后的中间件才能够被执行
在这里插入图片描述
Run

app.Run(context =>
{
  Console.WriteLine("run");
  return Task.FromResult("done");
});

Run方法区别于Use方法的最明显差异是
Run相当于一个终结点,Run之后的中间件不会被执行,因为它不像Use一样可以调用next.Invoke();

Map

app.Map("/map", app =>
{
  app.Run(context =>
  {
    Console.WriteLine("run");
    return Task.FromResult("run done");
  });
});

Map中间件最明显的特征是只有访问特定的路径才会执行

MapWhen

app.MapWhen(context => true, app =>
{
  app.Use(async (context, next) =>
  {
    Console.WriteLine("use1");
    await next.Invoke();
    Console.WriteLine("use2");
  });
});

MapWhen,当条件成立时,中间件才会被执行,并且MapWhen创建了一个新的管道,当满足条件时,新的管道会代替主管道,这意味着主管道的中间件不会被执行

UseWhen

app.UseWhen(context => true, app =>
{
  app.Use(async (context, next) =>
  {
    Console.WriteLine("use1");
    await next.Invoke();
    Console.WriteLine("use2");
  });
});

UseWhen和MapWhen类似,也是当条件成立时,中间件才会被执行,区别是UseWhen不会代替主管道

为了更好地说明UseWhen和MapWhen的差异,我们来做一个测试
在Startup的Configure方法最顶部分别用MapWhen、RunWhen自定义两个中间件

app.MapWhen(context => true, app =>
{
  app.Use(async (context, next) =>
  {
    Console.WriteLine("use1");
    await next.Invoke();
    Console.WriteLine("use2");
  });
});

//app.UseWhen(context => true, app =>
//{
//  app.Use(async (context, next) =>
//  {
//    Console.WriteLine("use1");
//    await next.Invoke();
//    Console.WriteLine("use2");
//  });
//});

在这里插入图片描述
不要采用IIS运行,采用控制台运行,以便能在控制台看见输出信息
在这里插入图片描述
注释UseWhen,运行
在这里插入图片描述
出现404,这是因为主管道被新的管道替代了,导致主管道的其它中间件没有被执行

再观察控制台,出现输出信息,说明我们定义的中间件正常执行了
在这里插入图片描述
再把UseWhen注释取消,把MapWhen注释掉,运行
正常出现Swagger页面,说明主管道没有被替换
在这里插入图片描述
控制台出现两次输出
在这里插入图片描述
咦?我们疑惑的发现UseWhen的中间件被执行了两次,而MapWhen的中间件只执行了一次
这是为什么呢?我也不是很清楚。
不过经过我的测试,我猜想UseWhen之所以调用了两次是因为在启动程序创建服务器时会判断一次UseWhen中的条件,结果为true则调用一次中间件,访问页面时又调用了一次,因此出现两次输出
而MapWhen在启动程序创建服务器时不会进行调用,只在访问时调用

使用扩展方法创建中间件
我们之前都是使用Use,Run,Map,MapWhen,UseWhen方法来自定义中间件,但是看一看创建项目时自动生成的代码,发现他们引入中间件都是以app.UseXXX的形式来引入的,感觉很高级的样子。
在这里插入图片描述
我们能不能也使用类似的方式来引入我们自己的中间件呢?这就需要用到扩展方法

具体步骤为:
新建一个静态类,之后编写一些静态方法,使用 this IApplicationBuilder app 来扩展app的方法,然后在方法内部定义中间件

public static class MyMiddleware
{
  public static void UseMyMiddleware(this IApplicationBuilder app)
  {
    app.Use(async (context, next) =>
    {
      Console.WriteLine("1");
      await next.Invoke();
      Console.WriteLine("2");
    });
  }
}

之后只要在Startup中引入我们自定义类的相关命名空间就可以使用我们的扩展方法了
例如:

app.UseMyMiddleware();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net 中间件的使用 Use,Run,Map,MapWhen,UseWhen 的相关文章

  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • 有没有办法将 boost::json::serializer 切换为美化输出?

    Using boost json serializer如中的示例所示文档 快速查看 http vinniefalco github io doc json json usage quick look html以紧凑格式保存 json tre
  • 求一个数的因数。无法得到准确的结果

    有人可以帮助纠正我的算法吗 我已经对几个数字进行了测试 但它没有输出完整的因式分解 对于具有大量因子的数字 它完全失败 int num 20 for int i 2 i lt num i if num i 0 cout lt lt i lt
  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • 带双重检查锁的单例设计模式

    假设您有以下代码 1 为什么我们使用双重检查锁 为什么单锁不够好 请提供详细的例子 2 这种实施方式的主要缺点是什么 我该如何证明呢 Thanks public sealed class SomeSingleton5 private sta
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 参数数量在编译时确定的 Lambda 函数

    我想声明一个带有 N 个参数的 lambda 函数 其中 N 是模板参数 就像是 template
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方
  • 如何在用户空间程序中使用内核 libcrc32c (或相同的函数)?

    我想在我自己的用户空间程序中进行一些 CRC 检查 我发现内核加密库已经在系统中 并且支持 SSE4 2 我尝试直接 include

随机推荐

  • SonarQube使用笔记

    SonarQube使用笔记 简介 SonarQube是一个用于管理代码质量的开放平台 可以快速的定位代码中潜在的或者明显的错误 目前支持java C C C Python PL SQL Cobol JavaScrip Groovy等二十几种
  • 在Linux上搭建sqli-labs

    1 先进入root权限 sudo su 然后输入账号密码 2 开启mysql mysql uroot p 3 改密码 MariaDB none gt SET password for root localhost password root
  • Python实战小游戏飞机大战详解

    大家还记得微信版 经典飞机大战 嘛 今天做的这款 打飞机 小游戏 画面诙谐 精致 完全复刻经典微信飞机大战哦 完全复刻 怎么 大家不信嘛 那跟着小编一起来看看吧 正文 一 环境安装 本文是写的游戏代码 基于Pygame的源码项目 这里是自己
  • Windows环境下Redis安装与配置的两种方式

    安装和配置Redis Redis的安装有两种安装形式 一种是安装包式 另一种是压缩包 注意 windows没有32位的 所以32位机器的朋友考虑换一下机器 一 安装包式 1 windows环境下的redis需要去github上获取 http
  • CSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped Windows

    CSWin Transformer A General Vision Transformer Backbone with Cross Shaped Windows 一 引言 二 方法实现 一 CSWin Transformer 二 体系结构
  • 检测SOTA!DEYO:YOLOv5+DETR成就地表最强目标检测器

    点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 目标检测 技术交流群 后台回复 2D检测综述 获取鱼眼检测 实时检测 通用2D检测等近5年内所有综述 目标检测是计算机视觉中的一个重要课题 后处理
  • Python中的矩阵操作

    Numpy 通过观察Python的自有数据类型 我们可以发现Python原生并不提供多维数组的操作 那么为了处理矩阵 就需要使用第三方提供的相关的包 NumPy 是一个非常优秀的提供矩阵操作的包 NumPy的主要目标 就是提供多维数组 从而
  • html页面跳转的方法

    html页面跳转的方法 1 html中使用meta中跳转 通过meta可以设置跳转时间和页面 2 a标签直接跳转 a href http baidu com 百度一下 a 3 通过javascript中实现跳转 直接跳转window loc
  • python之微信公众号内容爬取一(亲测可用)

    import requests from lxml import etree headers User Agent Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWebKit 537 36 KHTML
  • 微信小程序实现数值监听(页面和组件属性)

    简介 目前文章主要介绍对页面属性值的监听以及组件属性值的监听 需要异页面监听数据 请跳转至另一个文章介绍 为什么需要监听属性值 当需要通过一个属性变化时候 需要计算相应的方法等 pc网站经常需要监听属性 那么小程序应该怎么去实现 实现方法
  • elementui的表格排序的组件之问题---条件改变样式消失

    这两天写了一个需求 就是当我改变时间的时候 排序功能消失 这我就想不是很简单吗 但是是我太单纯了 这个是一个后台 肯定会用到element的组件 然后果不其然用的就是element里面的表格排序组件 elementUI table 首先熟悉
  • 移动端适配方案

    总共的方法 1 通过媒体查询的方式 2 以天猫首页为代表的 flex 弹性布局 3 以淘宝首页为代表的 rem viewport缩放 4 rem 方式 1 基本知识点 物理像素 硬件上屏幕上横向和纵向有多少个像素点 逻辑像素dp 程序认为屏
  • KVM详解-WEB管理界面及安装win2016

    文章目录 KVM的简介 KVM简介 2 关于virtual machine manager的介绍 二 安装及环境的部署 1 安装时系统要求 3 安装KVM虚拟化软件 kvm部署 kvm安装 启动服务 验证安装结果 测试并验证安装结果 查看网
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 手机大厂必备测试技能-CTS 兼容测试

    01 何为CTS 相信小伙伴们都有用过各种款式的Android手机 如小米 魅族 华为 oppo vivo 虽然他们的页面长的都不太一样 比如小米的长这样 魅族的 oppo的 还有垂死挣扎的锤子 但是这些手机其实都是搭载的Android系统
  • linux运维笔记-初级部分内容

    本文出自 老男孩linux运维 博客 请务必保留此出处http oldboy blog 51cto com 2561410 476884 运维初级内容参考列表 一 学习方法篇 老男孩Linux实战运维笔记 学习方法系列 1 学好运维四要素
  • 微信小程序订阅消息

    HTTPS 调用 请求地址 POST https api weixin qq com cgi bin message subscribe send access token ACCESS TOKEN 消息订阅官方文档 https devel
  • Java获取当前时间的年月日时分秒方法

    相关内容 package com ob import java text ParseException import java text SimpleDateFormat import java util Calendar import j
  • 异地多活paxos实现:Multi-Master-Paxos-3

    Background 200行代码实现paxos kv 中介绍了一款非常简洁的分布式kv存储实现 它是基于 classic paxos 实现分布式一致性 在 paxos的直观解释 中我们提到 每次写入 也就是每个 paxos 实例需要2轮
  • .net 中间件的使用 Use,Run,Map,MapWhen,UseWhen

    net 中间件的使用 Use Run Map MapWhen UseWhen net 提供了几种添加自定义中间件的方法Use Run Map MapWhen UseWhen Use app Use async context next gt