热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解.NET中的中间件

中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NETCore中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。

什么是中间件?

中间件是插入到应用程序请求处理管道中的组件,负责处理HTTP请求和响应。每个中间件可以决定是否将请求传递给下一个中间件,并且可以在调用下一个中间件之前或之后执行特定的操作。

  • 选择是否将请求传递给下一个中间件。
  • 可以在调用下一个中间件之前和之后执行工作。

请求委托(Request Delegates)用于构建请求管道,处理每个HTTP请求。这些委托可以通过Run、Map和Use扩展方法进行配置。请求委托可以以内联匿名方法的形式指定,也可以在可重用的类中定义。这些类和匿名方法共同构成了中间件或中间件组件。

中间件机制允许开发者通过简单的链式调用来处理复杂的请求流程,例如静态文件服务、身份验证、异常处理等。将HTTP模块迁移到中间件解释了ASP.NET Core与早期版本(如ASP.NET)之间请求处理管道的主要差异,并提供了更多示例。

使用 IApplicationBuilder 构建中间件管道

ASP.NET Core 的请求处理流程由一系列请求委托组成,如下图所示(执行流程遵循黑色箭头)。每个委托可以在调用下一个委托之前和之后执行操作,并可以选择不将请求传递给下一个委托,这种行为称为短路。短路有助于避免不必要的处理步骤,提高性能。例如,静态文件中间件可以在找到匹配的静态文件后立即返回结果,从而短路后续的中间件。

中间件管道执行流程

最简单的ASP.NET Core应用程序可能只有一个请求委托来处理所有请求。在这种情况下,针对每个HTTP请求都调用一个匿名方法。

第一个 「app.Run」 委托终止整个请求处理管道。

示例中间件管道
示例中间件管道
可以看出请求委托的执行顺序严格遵循上述流程图。

配置 HTTP 管道

你可以使用 Use、Run 和 Map 方法来配置HTTP管道。

  • Use 方法可以使管道短路,即不再调用后续的请求委托。
  • Run 方法通常用于定义管道的最终处理逻辑,一些中间件组件可能暴露 Run 方法以在管道末端运行。
  • Map 扩展方法用于根据请求路径分支请求流水线,如果请求路径以给定路径开头,则执行分支。

内置中间件

中间件作用
Authentication提供身份验证支持
CORS配置跨域资源共享
Response Caching提供缓存响应支持
Response Compression提供响应压缩支持
Routing定义和约束请求路由
Session提供用户会话管理
Static Files为静态文件和目录浏览提供服务支持
URL Rewriting Middleware用于重写 URL 并将请求重定向

自定义中间件

public class RequestCultureMiddleware { private readonly RequestDelegate _next; public RequestCultureMiddleware(RequestDelegate next) { _next = next; } public Task Invoke(HttpContext context) { var cultureQuery = context.Request.Query["culture"]; if (!string.IsNullOrWhiteSpace(cultureQuery)) { var culture = new CultureInfo(cultureQuery); CultureInfo.CurrentCulture = culture; CultureInfo.CurrentUICulture = culture; } return this._next(context); } }

以下代码展示了如何通过IApplicationBuilder的扩展方法暴露中间件:

public static class RequestCultureMiddlewareExtensions { public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder) { return builder.UseMiddleware(); } }

以下代码从 「Configure」 调用中间件:

app.UseRequestCulture();

每个请求的依赖关系

由于中间件是在应用程序启动时构建的,而不是每次请求时重新创建,因此中间件构造函数中注入的服务不会与其他依赖注入类型共享生命周期。如果你需要在中间件和其他类型之间共享作用域服务,请将这些服务添加到 Invoke 方法的签名中。Invoke 方法可以接受由依赖注入填充的其他参数。例如:

public class MyMiddleware { private readonly RequestDelegate _next; public MyMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext httpContext, IMyScopedService svc) { svc.MyProperty = 1000; await _next(httpContext); } }

你的点赞分享是对我最大的支持,点个再看呗!


推荐阅读
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本文探讨了在使用Azure Active Directory进行用户身份验证时,结合AddAuthentication和RequireAuthenticatedUser的必要性及其潜在冗余问题。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
author-avatar
偶然公大伟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有