用一个简单的例子教你如何 自定义ASP.NET Core 中间件(一)

2023-12-19

提起中间件大家一定不陌生,我们也用过.NET core很多很好用的中间件,但是如何自己写一个中间件呢,可能大部分同学不清楚怎么写,我之前也不会,看了微软官方文档 【 ASP.NET Core - 中间件 】感觉讲的也不是很清楚,下面就用一个简单的例子告诉大家什么是中间件,怎么自定义一个中间件。

中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:

  • 选择是否将请求传递到管道中的下一个组件。
  • 可在管道中的下一个组件前后执行工作。
  • 请求委托用于生成请求管道。 请求委托处理每个 HTTP 请求。

一句话总结:中间件是比筛选器更底层,更上游的面向切面技术,其性能最高,可处理的应用范围远比过滤器广,如实现网关, URL 转发,限流等等。

ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。

Request processing pattern showing a request arriving, processing through three middlewares, and the response leaving the app. Each middleware runs its logic and hands off the request to the next middleware at the next() statement. After the third middleware processes the request, the request passes back through the prior two middlewares in reverse order for additional processing after their next() statements before leaving the app as a response to the client.

每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常,也就是把app.UseExceptionHandler();异常处理代码放在最前面注入。

先来看一些常见的简单中间件

1、所有请求返回同一个结果

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello world!");
});

2、拦截所有请求(可多个)

            app.Use(async (context, next) =>
            {
                // 比如设置统一头
                context.Response.Headers["test1"] = "111";

                // 执行下一个中间件
                await next.Invoke();
            });

            app.Use(async (context, next) =>
            {
                // 比如设置统一头
                context.Response.Headers["test2"] = "222";

                // 执行下一个中间件
                await next.Invoke();
            });

            app.Use(async (context, next) =>
            {
                string headers = "";
                foreach (var header in context.Response.Headers)
                {
                    headers += header.Key + "=" + header.Value + "\n";
                }
                Console.WriteLine(headers);

                // 执行下一个中间件
                await next.Invoke();
            });

3、特定路由中间件(可多个)

            app.Map("/hello", app => {
                app.Run(async context =>
                {
                    await context.Response.WriteAsync("Map Test 1");
                });
            });

            app.Map("/no", app => {
                app.Run(async context =>
                {
                    await context.Response.WriteAsync("Map Test 2");
                });
            });

4、嵌套路由中间件(可多个)

app.Map("/level1", level1App => {
                level1App.Map("/level2a", level2AApp => {
                    app.Use(async (context, next) =>
                    {
                        // 比如设置统一头
                        context.Response.Headers["test1"] = "111";

                        // 执行下一个中间件
                        await next.Invoke();
                    });
                });
                level1App.Map("/level2b", level2BApp => {
                    app.Use(async (context, next) =>
                    {
                        string headers = "";
                        foreach (var header in context.Response.Headers)
                        {
                            headers += header.Key + "=" + header.Value + "\n";
                        }
                        Console.WriteLine(headers);

                        // 执行下一个中间件
                        await next.Invoke();
                    });
                });
            });

下一章继续教大家如何自定义一个中间件: 用一个简单的例子教你如何 自定义ASP.NET Core 中间件(二)-CSDN博客

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

用一个简单的例子教你如何 自定义ASP.NET Core 中间件(一) 的相关文章

  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • WebBrowser Control 导致整个应用程序变得无响应

    我有一个带有嵌入式 Web 浏览器的 C NET 3 5 应用程序 浏览器被设计为指向远程站点 而不是本地站点 一切工作正常 但是当页面响应缓慢时 这会导致我的整个应用程序变得无响应 直到加载页面 我不介意浏览器在执行任务时没有响应 但应用
  • 以编程方式获取命名管道的系统名称

    我正在使用 WCF NetNamedPipeBinding 编写进程间通信 我的目标是让服务在 net pipe localhost service 上运行 所以我运行最简单的主机 host new ServiceHost contract
  • 如何将 int.TryParse 与可为空的 int 一起使用? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 TryParse 来查找字符串值是否为整数 如果该值为整数 则跳过 foreach 循环 这是我的代码 string strValue 42 if int TryParse trim strVal
  • 表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误

    此错误发生在运行时 我不确定是什么原因导致的 代码对我来说看起来是正确的 include
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • DirectX Vertex 中的 THE 是什么

    我知道 RHW 是倒数同质 W 但有人可以解释一下它的使用方法和作用吗 gamedev论坛上的说明post http www gamedev net topic 440283 reciprocal of homogeneous w and
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 传输数据的 Symbol.WPAN.Bluetooth 示例

    我正在尝试将 EMDK 附带的 Symbol WPAN Bluetooth 用于 Symbol 设备 有人碰巧有一个传输数据的工作示例吗 Symbol 的示例只是将设备配对 他们显然认为在个人局域网示例中并不真正需要传输数据 不管怎样 我知
  • if(pointerVar) 与 if(pointerVar!=NULL) 相同吗?

    简单的问题 Is if pointerVar 与if pointerVar NULL 也是if pointerVar 与if pointerVar NULL 给我你在技术上最正确 迂腐的答案 这两种说法看起来和操作起来都是一样的 前者有什么
  • 将 LPTSTR 转换为要写入文件的字符串或 char *

    我想将 LPTSTR 转换为字符串或 char 以便能够使用 ofstream 将其写入文件 有任何想法吗 Use T2A http msdn microsoft com en us library 87zae4a3 VS 80 aspx宏
  • 如何收集和存储tellp()、tellg()返回类型?

    我正在编写一个在文件中维护 linked list 的程序 因此 我通过使用tellp tellg 遍历文件并将其添加到特定的长整数 可以视为偏移量 以到达新位置 一个简单的例子是 long next offset sizeof long
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • MSVC如何在编译期间输出一些内容到“输出”窗口

    有时我看到某些项目在编译期间向输出写入一些内容 在MSVC 中如何实现 thanks use pragma message e g define MESSAGE t message FILE STRINGXXX LINE t define
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 隐藏 MediaPlayer 控件(Microsoft 媒体平台播放器框架)

    我在 c xaml 应用程序中使用 MMP PF 提供我自己的控制元素来处理播放器 这就是为什么我想隐藏 禁用出现在底部的本机控件 在屏幕截图的屏幕中间 这只是使用了一个主题 有人知道该怎么做吗 我没能找到合适的房产 像这样使用 axWin
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable
  • printf 右对齐括号内的数字

    我正在编写一个程序 显示数组中的所有信息 它必须以括号中的数组索引开头 例如 2 并且它们必须彼此正确对齐 如果只是数字 我知道你可以这样做 printf 10d index 但是用括号括起来会得到以下输出 1 2 10 11 当我真正希望

随机推荐

  • 视频提取文字用什么软件好?来试试下面这几款吧

    听说你找不到识别字幕的插件 没问题 我这就来给你支招 其实识别字幕不一定得使用插件 许多软件也可以帮助你将视频内容识别出来 而且 世界上的字幕识别软件可不少呢 有的品质过硬 声名显赫 还有的藏着各种神奇的功能和特色 那么 你看到这里是否想知
  • 什么是过载?什么是过流?

    目录 过载是什么 过流是什么 过载保护 过电流保护 短路保护 过载是什么 在电网或者是我们的日常生活中所用到的每一个电气设备都会有一个额定功率 当设备的功率比额定功率高的时候我们称为过载 同样地 我们将对这种超过额定功率的保护称为过载保护
  • 外包干了5个月,技术退步太明显了。。。。。

    先说一下自己的情况 本科生生 18年通过校招进入武汉某软件公司 干了差不多4年的功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了5个月的功能测试 已经让我变得不思进取 谈了2年的
  • 说一下 jvm 有哪些垃圾回收算法?

    说一下 jvm 有哪些垃圾回收算法 一 对象是否已死算法 1 引用计数器算法 2 可达性分析算法 二 GC算法 1 标记清除算法 如果对象被标记后进行清除 会带来一个新的问题 内存碎片化 如果下次有比较大的对象实例需要在堆上分配较大的内存空
  • JMeter如何从数据库中获取数据并作为变量使用?

    前言 JMeter 如何从数据库中获取数据并作为变量使用 这在我们使用 JMeter 做 接口测试 压力测试 时经常碰到 今天通过两个示例 实现MySQL数据库的查询结果的 单值引用 和 多值引用 进行说明 这里虽然以MySQL数据库做说明
  • mybatis.interceptor.exception.SqLValidateException:Ilegal SQL::......

    现象 描述 执行 SQL 没问题 应用代码报错 mybatis interceptor exception SqLValidateException Ilegal SQL SELECT voucherNo FROM voucher ORDE
  • Java18都在路上了,你还在用Java8吗?

    Java18都在路上了 你还在用Java8吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 8
  • 利用阿里云的尖端数据库解决方案增强游戏数据管理

    在快节奏和动态的游戏世界中 对于努力为玩家提供无缝体验的公司来说 管理大量数据是一项关键挑战 阿里云是亚太地区的主要参与者 也是全球公认的运营数据库管理系统领导者 提供量身定制的创新解决方案 以应对游戏公司面临的独特数据管理挑战 这篇博客探
  • 大四复习:深入浅出解释拓扑排序

    我在大二学习拓扑排序的时候 不是很明白 现在已经大四 抽时间复习一下拓扑排序 什么是拓扑排序 如何实现拓扑排序 拓扑排序的拓展 什么是拓扑排序 首先拓扑排序的定义如下 拓扑排序是一种对有向无环图的顶点进行排序的方法 它的主要目的是产生一个顶
  • 自动驾驶多传感器融合学习笔记

    目录 BevFusion liar radar BevFusion BevFusion是一种多传感器融合技术 它可以将来自不同传感器 如LiDAR和相机 的数据融合到一个统一的BEV表示中 BevFusion的优点在于它能够结合多种传感器的
  • 面对众多知识付费平台,如何做出明智的选择?

    明理信息科技知识付费平台 在当今的知识付费市场中 用户面临的选择越来越多 如何从众多知识付费平台中正确选择属于自己的平台呢 下面 我们将为您介绍明理信息科技知识付费平台相比同行的优势 帮助您做出明智的选择 一 创新的技术架构 高效稳定 相比
  • 不会做项目惨遭部门领导批评,连刷35天分布式小册轻松拿下

    互联网发展到今天 用户数量越来越多 产生的数据规模也越来越大 应用系统必须支持高并发访问和海量数据处理的需求 对比集中式架构 分布式系统由于具有可扩展性 可以动态扩展服务和存储节点 使用廉价的机器构建高性能的服务 更适合如今的互联网业务 分
  • 人工智能125个常用名词解释

    1 什么是人工智能 人工智能 Artificial Intelligence 简称AI 是指计算机系统通过模拟人类的思维和行为来完成特定任务的技术和方法 人工智能的研究涉及多个学科 包括计算机科学 数学 心理学 哲学等领域 人工智能可以被分
  • 超快速人像磨皮软件/插件:SkinFiner 4

    SkinFiner 4是一款很好用的磨皮插件 这款插件可以帮助摄影师和后期制作人员快速 准确地修饰人像皮肤 提高图像质量 它具有操作简单 使用方便 处理速度快的特点 能够将繁琐的手动磨皮工作解放出来 以最简单和最快捷的方式磨皮和改善皮肤质感
  • WordPress主题 响应式个人博客主题Kratos源码

    Kratos 是一款专注于用户阅读体验的响应式 WordPress 主题 整体布局简洁大方 针对资源加载进行了优化 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净 简单且响应迅速的博客主题 Vt
  • PCB问题:Dummy NetPoint on shape:To suppress in report attach OK UNASSIGNED Shape解决方法

    问题 Total shapes not on a net To suppress in report attach OK UMASSIGMED SHAFE pr operty to shape 该问题一般都是在删除铜或者修铜时留下的 解决方
  • 深度学习中的KL散度

    1 KL散度概述 KL散度 Kullback Leibler Divergence 也称为相对熵 是信息论中的一个概念 用于衡量两个概率分布间的差异 它起源于统计学家Kullback和Leibler的工作 它的本质是衡量在用一个分布来近似另
  • 计算机毕设项目分享(含算法) 源码+论文(一)

    1 基于opencv的图像增强算法系统 直方图均衡化是通过调整图像的灰阶分布 使得在0 255灰阶上的分布更加均衡 提高了图像的对比度 达到改善图像主观视觉效果的目的 对比度较低的图像适合使用直方图均衡化方法来增强图像细节 使用中心为5的8
  • Gateway网关-路由的过滤器配置

    目录 一 路由过滤器 GatewayFilter 1 1 过滤器工厂GatewayFilterFactory 1 2 案例给所有进入userservice的请求添加一个请求头 Truth itcastis freaking awesome
  • 用一个简单的例子教你如何 自定义ASP.NET Core 中间件(一)

    提起中间件大家一定不陌生 我们也用过 NET core很多很好用的中间件 但是如何自己写一个中间件呢 可能大部分同学不清楚怎么写 我之前也不会 看了微软官方文档 ASP NET Core 中间件 感觉讲的也不是很清楚 下面就用一个简单的例子