ASP.NET Core 中间件

目录

一、常见的内置中间件

二、自定义中间件

三、中间件的执行顺序

四、其他自动逸中间件案例

1. 身份验证中间件

2、跨域中间件(CORS)


ASP.NET Core 中,中间件(Middleware)是处理 HTTP 请求和响应的组件链。你可以在 Startup.csProgram.cs 中通过 app.UseMiddleware<T>() 来添加中间件。除了使用内置的中间件,ASP.NET Core 允许你定义自己的中间件,以满足特定的业务需求。

一、常见的内置中间件

app.UseMiddleware 之前,ASP.NET Core 已经提供了很多常见的中间件,适用于不同的功能需求:

二、自定义中间件

        自定义中间件可以帮助你在 ASP.NET Core 应用中实现各种业务逻辑,如身份验证、日志记录、性能监控、错误处理、请求响应修改等。通过 app.UseMiddleware<T>() 可以将自定义中间件添加到请求管道中,实现灵活、可定制的功能。

创建中间件类: 中间件通常是一个类,它包含一个 InvokeInvokeAsync 方法,该方法接收 HttpContext 并返回一个 Task,通常会在方法内部执行一些逻辑,然后调用管道中的下一个中间件。

例如,定义一个简单的日志记录中间件:

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;

    public LoggingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 请求之前的日志
        Console.WriteLine($"Request URL: {context.Request.Path}");

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

        // 响应之后的日志
        Console.WriteLine($"Response Status: {context.Response.StatusCode}");
    }
}

RequestDelegate next: 这是管道中下一个中间件的委托。ASP.NET Core 中间件是链式的,每个中间件都会调用 next(context) 来将请求传递给管道中的下一个中间件。

注册中间件: 在 Configure 方法中通过 app.UseMiddleware<LoggingMiddleware>() 来将自定义中间件添加到请求处理管道中。

public void Configure(IApplicationBuilder app)
{
    app.UseMiddleware<LoggingMiddleware>();
    // 其他中间件
}

你可以将中间件放置在管道中的不同位置,根据执行顺序来决定它的作用范围。

自定义中间件的常见应用场景:

  1. 日志记录: 可以创建一个中间件来记录每个请求的详细信息(如请求 URL、请求体、响应状态码等),以便于后期分析和排查问题。

  2. 认证与授权: 如果你有一些自定义的认证或授权逻辑,可以创建中间件来在请求处理之前进行检查。

  3. 错误处理: 自定义错误处理程序可以捕获异常并根据需要返回适当的错误信息,或者记录详细的错误信息。

  4. 性能监控: 你可以创建中间件来衡量请求的响应时间,进行性能分析,记录执行时间等。

  5. CORS 自定义: 你可以实现自定义的跨域资源共享(CORS)策略,根据请求的来源和其他条件来判断是否允许跨域访问。

  6. 请求/响应修改: 你可以在中间件中处理请求和响应数据,例如修改请求的头部信息,或者在响应中添加一些自定义的头部或数据。

  7. 请求计数与速率限制: 实现请求计数器或者速率限制器,中间件可以根据请求数量限制特定 API 的调用频率。

三、中间件的执行顺序

中间件的执行顺序是按照它们被注册的顺序来执行的。即先注册的中间件会先执行,后注册的中间件会后执行。

  • 请求管道:请求从上到下,依次通过所有中间件。每个中间件可以选择修改请求并传递给下一个中间件。
  • 响应管道:响应从下到上,依次经过中间件进行修改。每个中间件都可以选择修改响应并传递给上一个中间件。

四、其他自动逸中间件案例

1. 身份验证中间件

如果你想要在请求过程中对用户进行身份验证,可以创建一个中间件来检查用户的认证信息(如 JWT 令牌):

public class AuthenticationMiddleware
{
    private readonly RequestDelegate _next;

    public AuthenticationMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
        if (string.IsNullOrEmpty(token))
        {
            context.Response.StatusCode = 401; // Unauthorized
            await context.Response.WriteAsync("Unauthorized");
            return;
        }

        // 验证 token 逻辑...
        
        // 继续处理请求
        await _next(context);
    }
}

2、跨域中间件(CORS)

创建一个中间件来根据请求的来源动态处理 CORS:

public class CorsMiddleware
{
    private readonly RequestDelegate _next;

    public CorsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var origin = context.Request.Headers["Origin"];
        if (origin != null && origin == "https://alloweddomain.com")
        {
            context.Response.Headers.Add("Access-Control-Allow-Origin", origin);
        }

        await _next(context);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/962944.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LevelDB 源码阅读:写入键值的工程实现和优化细节

读、写键值是 KV 数据库中最重要的两个操作&#xff0c;LevelDB 中提供了一个 Put 接口&#xff0c;用于写入键值对。使用方法很简单&#xff1a; leveldb::Status status leveldb::DB::Open(options, "./db", &db); status db->Put(leveldb::WriteOptions…

2007-2019年各省科学技术支出数据

2007-2019年各省科学技术支出数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、科学技术支出 4、范围&#xff1a;31省 5、指标解释&#xff1a;科学技术支出是指为促进科学研究、技术开发…

2025年1月22日(网络编程 udp)

系统信息&#xff1a; ubuntu 16.04LTS Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习…

如何对系统调用进行扩展?

扩展系统调用是操作系统开发中的一个重要任务。系统调用是用户程序与操作系统内核之间的接口,允许用户程序执行内核级操作(如文件操作、进程管理、内存管理等)。扩展系统调用通常包括以下几个步骤: 一、定义新系统调用 扩展系统调用首先需要定义新的系统调用的功能。系统…

当卷积神经网络遇上AI编译器:TVM自动调优深度解析

从铜线到指令&#xff1a;硬件如何"消化"卷积 在深度学习的世界里&#xff0c;卷积层就像人体中的毛细血管——数量庞大且至关重要。但鲜有人知&#xff0c;一个简单的3x3卷积在CPU上的执行路径&#xff0c;堪比北京地铁线路图般复杂。 卷积的数学本质 对于输入张…

深度学习的应用

目录 一、机器视觉 1.1 应用场景 1.2 常见的计算机视觉任务 1.2.1 图像分类 1.2.2 目标检测 1.2.3 图像分割 二、自然语言处理 三、推荐系统 3.1 常用的推荐系统算法实现方案 四、图像分类实验补充 4.1 CIFAR-100 数据集实验 实验代码 4.2 CIFAR-10 实验代码 深…

Flutter常用Widget小部件

小部件Widget是一个类&#xff0c;按照继承方式&#xff0c;分为无状态的StatelessWidget和有状态的StatefulWidget。 这里先创建一个简单的无状态的Text小部件。 Text文本Widget 文件&#xff1a;lib/app/app.dart。 import package:flutter/material.dart;class App exte…

mysqldump+-binlog增量备份

注意&#xff1a;二进制文件删除必须使用help purge 不可用rm -f 会崩 一、概念 增量备份&#xff1a;仅备份上次备份以后变化的数据 差异备份&#xff1a;仅备份上次完全备份以后变化的数据 完全备份&#xff1a;顾名思义&#xff0c;将数据完全备份 其中&#xff0c;…

智能园区管理系统助力企业安全与效率双提升的成功案例分析

内容概要 在当今迅速发展的商业环境中&#xff0c;企业面临着资产管理、风险控制和运营效率提高等多重挑战。为了应对这些挑战&#xff0c;智能园区管理系统应运而生&#xff0c;为企业提供了全新的解决方案。例如&#xff0c;快鲸智慧园区&#xff08;楼宇&#xff09;管理系…

洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解

一、题目链接 P10289 [GESP样题 八级] 小杨的旅游 - 洛谷 二、题目大意 n个节点之间有n - 1条边&#xff0c;其中k个节点是传送门&#xff0c;任意两个传送门之间可以 以0单位地时间相互到达。问从u到v至少需要多少时间&#xff1f; 三、解题思路 输入不必多讲。 cin >> …

本地部署DeepSeekp R1教程

目录 一.打开ollama官网&#xff0c;下载安装 1.下载完成双击安装程序 2.winr 输入cmd打开命令行输入命令 查看是否安装成功 二.部署DeepSeek R1模型 1. 下载模型&#xff1a;终端输入 (根据你的显存大小选择版本&#xff0c;16g就可以选择14b/32b)**电脑配置很低的话选…

OVS-DPDK

dpdk介绍及应用 DPDK介绍 DPDK&#xff08;Data Plane Development Kit&#xff09;是一组快速处理数据包的开发平台及接口。有intel主导开发&#xff0c;主要基于Linux系统&#xff0c;用于快速数据包处理的函 数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

87.(3)攻防世界 web simple_php

之前做过&#xff0c;回顾 12&#xff0c;攻防世界simple_php-CSDN博客 进入靶场 <?php // 显示当前 PHP 文件的源代码&#xff0c;方便调试或查看代码结构 // __FILE__ 是 PHP 的一个魔术常量&#xff0c;代表当前文件的完整路径和文件名 show_source(__FILE__);// 包含…

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种基于发布/订阅模式的轻量级通讯协议&#xff0c;构建于TCP/IP协议之上。它最初由IBM在1999年发布&#xff0c;主要用于在硬件性能受限和网络状况不佳的情…

Airflow:深入理解Apache Airflow Task

Apache Airflow是一个开源工作流管理平台&#xff0c;支持以编程方式编写、调度和监控工作流。由于其灵活性、可扩展性和强大的社区支持&#xff0c;它已迅速成为编排复杂数据管道的首选工具。在这篇博文中&#xff0c;我们将深入研究Apache Airflow 中的任务概念&#xff0c;探…

【数据结构篇】时间复杂度

一.数据结构前言 1.1 数据结构的概念 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c; 如&#xff1a…

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)

文章目录 Kafka 副本机制&#xff08;包含AR、ISR、OSR、HW 和 LEO 介绍&#xff09;1. 副本的基本概念2. 副本同步和一致性2.1 AR&#xff08;Assigned Replicas&#xff09;2.2 ISR&#xff08;In-Sync Replicas&#xff09;2.3 OSR&#xff08;Out-of-Sync Replicas&#xf…

完美还是完成?把握好度,辨证看待

完美还是完成&#xff1f; 如果说之前这个答案有争议&#xff0c;那么现在&#xff0c;答案毋庸置疑 ■为什么完美大于完成 ●时间成本&#xff1a; 做事不仅要考虑结果&#xff0c;还要考虑时间和精力&#xff0c;要说十年磨一剑的确质量更好&#xff0c;但是现实没有那么多…

Kafka中文文档

文章来源&#xff1a;https://kafka.cadn.net.cn 什么是事件流式处理&#xff1f; 事件流是人体中枢神经系统的数字等价物。它是 为“永远在线”的世界奠定技术基础&#xff0c;在这个世界里&#xff0c;企业越来越多地使用软件定义 和 automated&#xff0c;而软件的用户更…

电磁波谱与图像

我们所处的世界&#xff0c;其实是被各种各样的电磁波所包围的&#xff0c;从我们能看到的可见光&#xff0c;到不可见的红外&#xff0c;以及紫外&#xff0c;X&#xff0c;Gamma 射线&#xff0c;还有信息传输中的无线电波&#xff0c;雷达波&#xff0c;都属于电磁波。 引用…