ASP.NET Core中创建中间件的几种方式

前言

今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式。

中间件介绍

ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件,它们被安排在请求处理管道中,并按顺序执行。中间件的设计是为了使其在请求处理管道中能够以灵活和可扩展的方式处理 HTTP 请求和响应。

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道:

了解现有中间件的顺序,以及在哪里添加自定义中间件。你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。

中间件用途

开发者通过在请求处理管道中添加不同的中间件(Middleware)组件,可以实现应用程序的认证和授权、日志记录、异常处理、静态文件处理、路由和端点映射、CORS(跨域资源共享)、会话管理、请求压缩、国际化和本地化、缓存等各种功能。

通过请求委托添加中间件

我们可以通过在 WebApplication 实例上调用 Use 方法,并提供一个带有两个参数的 lambda 方法来实现。第一个参数是 HttpContext,第二个参数是管道中的实际下一个请求委托。

            var builder = WebApplication.CreateBuilder(args);var app = builder.Build();app.Use(async (context, next) =>{// 在这里处理请求// ...await next.Invoke();// 在这里处理响应// ...});app.Run();

按约定添加中间件

ASP.NET Core中提供了许多内置中间件,例如静态文件中间件、路由、认证、授权中间件等。这些中间件通常已经预先定义好了,开发者只需按照约定调用相应的方法即可。

            var builder = WebApplication.CreateBuilder(args);var app = builder.Build();// 使用静态文件中间件app.UseStaticFiles();// 使用路由中间件app.UseRouting();// 使用认证中间件app.UseAuthentication();// 使用授权中间件app.UseAuthorization();app.Run();

创建自定义中间件类

创建自定义中间件类

首先我们创建一个自定义中间件类 RequestLoggingMiddleware,它将记录每个请求的详细信息。

    public class RequestLoggingMiddleware{private readonly RequestDelegate _next;public RequestLoggingMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context){// 记录请求信息Console.WriteLine($"Request Method: {context.Request.Method}");Console.WriteLine($"Request Path: {context.Request.Path}");// 调用下一个中间件await _next(context);// 记录响应状态码Console.WriteLine($"Response Status Code: {context.Response.StatusCode}");}}

创建扩展方法

为了方便在应用程序中注册中间件,我们可以创建一个扩展方法。

    public static class RequestLoggingMiddlewareExtensions{public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder){return builder.UseMiddleware<RequestLoggingMiddleware>();}}

在应用程序中使用自定义中间件

在 Program.cs 文件中,使用自定义中间件。

            var builder = WebApplication.CreateBuilder(args);var app = builder.Build();// 使用自定义中间件app.UseRequestLogging();app.Run();

添加基于工厂的中间件

IMiddlewareFactory 是 ASP.NET Core 中用于创建和管理中间件实例的接口。它提供了一种灵活的方式来控制中间件的创建和生命周期管理,特别是在需要复杂依赖注入或条件实例化的场景中。

创建自定义中间件工厂

实现 IMiddlewareFactory 接口的自定义工厂类。

    public class CustomMiddlewareFactory(IServiceProvider serviceProvider) : IMiddlewareFactory{private readonly IServiceProvider _serviceProvider = serviceProvider;public IMiddleware? Create(Type middlewareType){// 使用服务提供者创建中间件实例return _serviceProvider.GetService(middlewareType) as IMiddleware;}public void Release(IMiddleware middleware){// 如果需要,可以在这里释放中间件实例(容器负责释放资源)(middleware as IDisposable)?.Dispose();}}

创建自定义中间件

实现 IMiddleware 接口的自定义中间件类。

    public class CustomMiddleware : IMiddleware{public async Task InvokeAsync(HttpContext context, RequestDelegate next){Console.WriteLine("在这里处理请求.......");await next(context);Console.WriteLine("在这里处理响应.......");}}

注册中间件和工厂

在 Program.cs 文件中注册自定义中间件和工厂。

            var builder = WebApplication.CreateBuilder(args);// 注册中间件和工厂到依赖注入容器builder.Services.AddTransient<CustomMiddleware>();builder.Services.AddTransient<IMiddlewareFactory, CustomMiddlewareFactory>();var app = builder.Build();// 使用基于工厂的中间件app.UseMiddleware<CustomMiddleware>();app.Run();

最后总结

在ASP.NET Core中添加和创建中间件的方式有很多种,本文列举了四种常见的方式,具体取决于你的需求和偏好。每种方式都有其适用的场景,选择合适的方法可以使你的代码更加简洁和易于维护。

文章转载自:追逐时光者

原文链接:https://www.cnblogs.com/Can-daydayup/p/18297439

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES 慢上游响应问题优化在用户体验场景中的实践

在抖音亿级日活流量的情况下&#xff0c;每天收到的用户反馈也是大量的&#xff0c;而用户反馈对于产品的发展与未来是至关重要的&#xff0c;因此用户体验管理平台&#xff08;简称VoC&#xff09;就应运而生&#xff0c;VoC 平台旨在通过技术平台化的方式&#xff0c;结合反馈…

uni-app 保存号码到通讯录

1、 添加模块 2、添加权限 3、添加策略 Android&#xff1a; "permissionExternalStorage" : {"request" : "none","prompt" : "应用保存运行状态等信息&#xff0c;需要获取读写手机存储&#xff08;系统提示为访问设备上的照片…

房屋出租管理系统小程序需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销&#xff1b;提供资产管理&#xff0c;合同管理&#xff0c;租赁管理&#xff0c; 物业管理&#xff0c;门禁管理等一体化的运营管理平台&#xff0c;提高项目方管理运营效率…

Eureka: Netflix开源的服务发现框架

在微服务架构中&#xff0c;服务发现是一个关键组件&#xff0c;它允许服务实例之间相互发现并进行通信。Eureka是由Netflix开源的服务发现框架&#xff0c;它是Spring Cloud体系中的核心组件之一。Eureka提供了服务注册与发现的功能&#xff0c;支持区域感知和自我保护机制&am…

电脑如何快速删除相同的文件?分享5款重复文件删除工具

您有没有发现最近电脑运行速度变慢了&#xff1f;启动时间变得更长&#xff0c;甚至完成简单任务也难以如常&#xff1f;这可能是因为重复文件堆积所致。我们发现&#xff0c;清理或移动这些重复的文件和文件夹可以产生惊人的效果。通过删除不必要的重复文件和垃圾文件&#xf…

从LeetCode215看排序算法

目录 LeetCode215 数组的第K个最大元素 ① 第一反应&#xff1a;java的内置排序Arrays.sort() ② 冒泡排序 ③归并排序&#xff08;先分解再合并&#xff09; ④快速排序&#xff08;边分解边排序&#xff09; ⑤堆排序 LeetCode215 数组的第K个最大元素 给定整数数组 nums…

Spring Boot有哪些优点和缺点

Spring Boot作为一个基于Spring框架的开源项目&#xff0c;旨在简化Spring应用的初始搭建以及开发过程。以下是Spring Boot的主要优点和缺点&#xff1a; 优点 简化项目配置&#xff1a; Spring Boot采用“约定优于配置”的原则&#xff0c;通过自动配置提供默认配置&#xff…

ubuntu基于cmakelist的Qt工程,如何将图片打包进二进制程序

qt界面使用的图片打包进入二进制可执行程序&#xff0c;可以避免发布的软件&#xff0c;因为路径问题无法加载图片的问题。 以下步骤参考自百度AI. 步骤如下&#xff1a; 1.创建一个新的Qt资源文件&#xff08;.qrc文件&#xff09; 2.在*.qrc文件中添加图片路径 qrc文件使用…

【ceph】ceph集群-添加/删除mon

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

无障碍开发的艺术:Xcode打造可访问性应用全指南

无障碍开发的艺术&#xff1a;Xcode打造可访问性应用全指南 在软件开发中&#xff0c;可访问性&#xff08;Accessibility&#xff09;开发是确保应用能够被更广泛用户群体使用的关键。Xcode作为苹果公司提供的集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了一系…

LeetCode HOT100(四)字串

和为 K 的子数组&#xff08;mid&#xff09; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 解法1&#xff1a;前缀和Map 这…

(Vue+SpringBoot+elementUi+WangEditer)仿论坛项目

项目使用到的技术与库 1.前端 Vue2 elementUi Cookie WangEditer 2.后端 SpringBoot Mybatis-Plus 3.数据库 MySql 一、效果展示 1.1主页效果&#xff1a; 1.2 文章编辑页面&#xff1a; 1.3 成功发布文章 1.4 文章关键字搜索提示 1.5 文章查询结果展示 1.6 文章内容及交互展示…

期货量化交易客户端开源教学第一节——交易服务器的安装

上传“交易服务端”到服务器把“交易服务器版本2”解压到dht unzip 交易服务端.ziprpm -Uvh mysql-community-release-el6-5.noarch.rpm (tab键)yum install mysql-community-server //y yvi /etc/selinux/config 将SELINUX=enforcing改为SELINUX=disabled(需要重启)//阿里云已…

linux怎么查看系统重启原因?LINUX系统不明原因重启解决步骤,在Linux中如何排查系统启动问题?

linux怎么查看系统重启原因&#xff1f;LINUX系统不明原因重启解决步骤&#xff0c;在Linux中如何排查系统启动问题&#xff1f; linux怎么查看系统重启原因&#xff0c;网上大部分总结的步骤如下&#xff1a; 查看系统日志&#xff1a;系统日志中存储了系统重启异常的情况及其…

TransT: 基于类型的多重嵌入表示用于知识图谱补全

1 引言 1.1 问题 仅仅依赖于三元组的结构化信息有其局限性&#xff0c;因为它们往往忽略了知识图谱中丰富的语义信息以及由这些语义信息所代表的先验知识。语义信息是指实体和关系的含义&#xff0c;比如“北京”是“中国”的首都&#xff0c;“苹果”是一种水果。先验知识则…

ESP32CAM物联网教学12

ESP32CAM物联网教学12 MicroPython 视频服务 小智希望能在MicroPython中实现摄像头的视频服务&#xff0c;就像官方示例程序CameraWebServer那样。 下载视频服务驱动库 小智通过上网搜索&#xff0c;发现相关的教学材料还不少&#xff0c;并且知道有人已经写出了视频服务的驱…

Redis的哨兵和集群实现高可用

一个典型的高可用Redis集群示例配置 1个主服务器 2-3个从服务器 3-5个哨兵 哨兵和集群就是为了高可用 哨兵 哨兵的功能&#xff1a;监听和故障转移 &#xff08;1&#xff09;客户端可以从哨兵获得集群的状态。 &#xff08;2&#xff09;当主服务器断开&#xff0c;哨兵可…

UI图标库推荐网站

在推荐图标库时&#xff0c;我会考虑图标的多样性、质量、易用性以及是否免费或开源等因素。以下是一些值得推荐的图标库&#xff1a; 1. Font Awesome 特点&#xff1a;Font Awesome是一套绝佳的图标字体库和CSS框架&#xff0c;提供可缩放的矢量图标。您可以使用CSS所提供的…

24/7/12总结

axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…