用一个简单的例子教你如何 自定义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 中间件(一) 的相关文章

  • 模板类包装任意类型/非类型模板类

    假设我有一个模板类base和一个班级wrapper其中包含一个实例化成员base 我想定义班级wrapper这样它依赖于模板参数包 该参数包只是 传递 给实例化成员base 例如 考虑下面的代码 它工作得很好 include
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • 根据拦截和返回值自动重试客户端WCF调用

    是否可以拦截 WCF 调用的结果并重试该操作 例如 操作的返回值可能包含状态代码 指示我传递到原始调用的会话令牌已过期 在这种情况下 我可以检索新的会话令牌并使用新的会话令牌重试调用 是否可以通过使用 WCF 拦截返回值 检查它 然后以对操
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 使用 AutoMapper 进行 LINQ GroupBy 聚合

    试图让查询工作 但老实说不确定如何 或者是否可能 进行它 因为我尝试过的一切都不起作用 共查询6个表 Person PersonVote PersonCategory Category City FirstAdminDivision Per
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • 删除对象时指针自动指向空

    假设我有一个对象和其他几个不同类类型的对象中的 10 个指向它的指针 如果对象被删除 这些指针必须设置为空 通常我会将对象的类与具有指向它的指针的类互连 以便它可以通知它们它正在被删除 并且它们可以将它们的指针设置为空 但这也有一个负担 即
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015

随机推荐

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

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

    目录 过载是什么 过流是什么 过载保护 过电流保护 短路保护 过载是什么 在电网或者是我们的日常生活中所用到的每一个电气设备都会有一个额定功率 当设备的功率比额定功率高的时候我们称为过载 同样地 我们将对这种超过额定功率的保护称为过载保护
  • 外包干了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 中间件 感觉讲的也不是很清楚 下面就用一个简单的例子