热门标签 | 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); } }

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


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • andr ... [详细]
  • 5G至4G空闲态移动TAU流程解析
    本文详细解析了用户从5G网络移动到4G网络时,在空闲态下触发的跟踪区更新(TAU)流程。通过N26接口实现无缝迁移,确保用户体验不受影响。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
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社区 版权所有