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

2023-12-19

上一章已经说过了,中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:

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

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

下面用一个简单例子来说明如何自定义一个中间件:

新建一个类:MyMiddleware

    public class MyMiddleware
    {
        private ILogger<MyMiddleware> logger;//日志记录类
        private readonly RequestDelegate _next;//请求委托:用于生成请求管道

        public MyMiddleware(ILogger<MyMiddleware> logger, RequestDelegate next)
        {
            this.logger = logger;
            _next = next;
        }

        public Task InvokeAsync(HttpContext context)
        {
            //给请求添加一个自定义头字段
            context.Request.Headers["lwpoor"] = "123";
            logger.LogInformation($"这是{nameof(MyMiddleware)}中间件");
            string headers = "\n--------------headers------------\n";
            foreach (var header in context.Request.Headers)
            {
                headers+=header.Key + "=" + header.Value + "\n";
            }
            headers += "--------------------------------";
            logger.LogInformation(headers);

            // 调用下一个中间件
            return _next(context);
        }
    }

写一个扩展方法,将中间件暴露出去:

新建一个静态类:MyMiddlewareExtensions

    /// <summary>
    /// 扩展方法,将中间件暴露出去
    /// </summary>
    public static class MyMiddlewareExtensions
    {
        /// <summary>
        /// 测试中间件
        /// </summary>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static IApplicationBuilder UseLwpoor(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<MyMiddleware>();
        }
    }

最后一步注册中间件:

app.UseLwpoor();//注册中间件

这样就自己定义了一个简单的中间件,运行程序看一下:

需要注意的地方:

自定义中间件必须要实现 InvokeAsync 公共方法,参数必须保持一致,它是中间件执行的入口

如果没有实现 InvokeAsync 方法运行会报错:“找不到'Hero.Jwt.MyMyMiddleware'类型的中间件的公共'Invoke'或'InvokeAsync'方法

必须要在构造函数里面申明请求委托 RequestDelegate ,用于生成请求管道:

并且在完成后 return _next(context) 调用下一个中间件

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

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

  • 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接 [重复]

    这个问题在这里已经有答案了 可能的重复 使用扩展方法表示的嵌套 from LINQ 查询 https stackoverflow com questions 9115675 nested from linq query expressed
  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • 命名空间“Microsoft”中不存在类型或命名空间名称“Practices”

    我正在使用 Microsoft Visual Studio 2005 for c 我的代码中有以下命名空间 using Microsoft Practices EnterpriseLibrary using Microsoft Practi
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa
  • char* argv[] 在 c/c++ 中如何工作? [复制]

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

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 如何使用 xamarin 表单提示用户进行地理定位

    我正在 Xamarin Forms 应用程序中开发一个应用程序 需要请求地理位置权限 如果获得许可 它需要从设备获取地理位置数据 然后将地理位置坐标放入 Forecast io URL 我正在使用 James 的 Geolocator 插件
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s

随机推荐

  • Netty火热平时却接触不多?1515页Netty学习进阶笔记真香

    Netty 的介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架 现为 Github 上的独立项目 Netty 是一个异步的 基于事件驱动的网络应用框架 用以快速开发高性能 高可靠性的网络IO 程序 Netty 是一个异步的
  • vscode 内置(自带)功能使用

    vscode 搜索 功能 使用正则表达式 参考文章 Justice23 参考文章 熟悉的新风景 转义字符 匹配内容 t tab r 回车符号 r n 换行符号 n 特殊符号转义 如
  • JMeter —— 如何循环使用接口返回的多个值!

    在用JMeter做接口测试的时候 经常会遇到这样一种情况 一个接口请求返回了多个值 然后下一个接口想循环使用前一个接口的返回值 第二种情况 只想循环请求前一个接口返回值中的随机不定长度的某一些值 并不想用全部的 今天 我就和大家讲解一下这两
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证

    public Task InvokeAsync HttpContext context 获取终点路由特性 var endpointFeature context Features Get
  • Web自动化测试流程:从入门到精通,帮你成为测试专家

    摘要 Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具
  • 滚动条样式

    webkit scrollbar 滚动条整体样式 width 10px 高宽分别对应横竖滚动条的尺寸 height 10px webkit scrollbar thumb 滚动条里面小方块 border radius 10px box sh
  • 使用DTS将自建MySQL迁移至PolarDB MySQL引擎,探索DTS全量数据校验

    1 领取免费的ECS和PolarDB资源 一旦您注册了阿里云账号并填写了您的账号和支付信息 您就可以申请免费试用我们的产品 如ECS PolarDB RDS等服务 1 1 申请 ECS 免费试用 1 在 阿里云免费试用中心 找到ECS 单击
  • .NET Core中鉴权 Authentication Authorization

    Authentication 鉴定身份信息 例如用户有没有登录 用户基本信息 Authorization 判定用户有没有权限 使用框架提供的Cookie鉴权方式 1 首先在服务容器注入鉴权服务和Cookie服务支持 services Add
  • 【S025】SpringBoot OA办公管理系统项目源码 办公自动化

    项目标题 SpringBoot OA办公管理系统项目源码 Java毕业设计 项目编号 S025 功能介绍 OA办公自动化系统 使用Maven进行项目管理 基于springboot框架开发的项目 mysql底层数据库 前端采用freemark
  • 如何学好信息安全?大学信息安全专业研发技能表-成为信息安全专业优秀人才

    网络空间安全 信息安全 的重要性这几年被提升到前所未有的高度 国家更是高度重视 并且特批成立了网络空间安全一级学科 各大高校积极申报博士点 硕士点 开设信息安全专业的高校越来越多 那么 对于信息安全专业的大一新生如何学好 可能很多同学都在迷
  • CODESYS的Robotics_PickAndPlace_without_Depictor例程解释

    1 简介 在CODESYS的例程中 有一个例程演示了如何控制delta机械手从一个移动的转盘中拾取一个工件 ring 圆环 然后放到移动的传送带上的托盘 cone 圆锥 中 这个例程在 C Program Files x86 CODESYS
  • 深度学习14—注意力机制与自注意力机制

    注 以下均为个人学习笔记 发布只为方便学习阅读 若觉侵权 请联系删除 1 李沐老师课堂学习理解笔记 1 1 随意线索和不随意线索 1 2 注意力机制 通过注意力池化层来有偏向性的选择某些输入 1 3 注意力池化层 1 3 1 非参数化注意力
  • 手写识别软件哪个好?来试试下面这几款吧

    听说你对手写文字识别软件很感兴趣啊 你就是那个总是在笔记本上写密密麻麻的字 然后又懒得一个个去打字的家伙吧 别担心 这个世界已经听到你的呼唤 手写文字识别技术就是为了解放你的双手费尽心思开发的 现在 让我来告诉你手写文字识别最简单的方法有哪
  • 基于SpringBoot的房屋租赁系统 附源码

    基于SpringBoot的房屋租赁系统 附源码 文章目录 基于SpringBoot的房屋租赁系统 附源码 一 引言 二 系统设计 三 技术架构 四 功能实现 五 界面展示 六 源码获取 一 引言 本文介绍了一个基于SpringBo
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Qt Quick 工程创建

    一 简介 Qt Quick是Qt框架中的一个模块 用于创建现代 响应式的用户界面 它基于QML Qt Meta Object Language 语言和Qt Quick Controls库 提供了一种声明性的方式来构建用户界面 Qt Quic
  • [APM32F4]基于APM32F411控制的一个软开关电路设计分享

    1 前言 说明 本文介绍的软开关电路 并不是 开关电源 里面的软开关概念 而是系统供电的开关 结合MCU等控制芯片 控制系统供电的开启或关断 在某些电子产品的场合 我们经常会需要用到按键长按进行开机 然后按键长按进行关机 或者按键长按之后有
  • 图像配准 CVPRW21 - 深度特征匹配 DFM

    本文转自 图像配准 CVPRW21 深度特征匹配 DFM 深度学习图像配准 CSDN博客 github地址 https github com ufukefe DFM 相识 图像配准 Image Registration 是计算机视觉领域中的
  • 性能测试:如何使用window系统资源监控!

    系统资源监控通常分为两类系统 window和类unix unix linux aix window系统资源监控 window系统资源监控有两种方法 一是使用loadrunner工具进行监控 二是使用windows自带的性能工具perfmon
  • 用一个简单的例子教你如何 自定义ASP.NET Core 中间件(二)

    上一章已经说过了 中间件是一种装配到应用管道以处理请求和响应的软件 每个组件 选择是否将请求传递到管道中的下一个组件 可在管道中的下一个组件前后执行工作 请求委托用于生成请求管道 请求委托处理每个 HTTP 请求 一句话总结 中间件是比筛选