dotnet学习笔记-专题06-过滤器和中间件-01
1. 基本概念
在ASP.NET Core中,中间件和过滤器都是处理HTTP请求的重要组件,但它们在应用中的位置、作用范围以及使用方式有所不同。
1.1 中间件和过滤器的区别
1.1.1 中间件
位置与作用范围:中间件位于ASP.NET Core应用程序请求处理管道的核心位置,它可以处理进入应用程序的每一个HTTP请求和响应。中间件按照定义的顺序执行,每个中间件都有机会处理请求,或者将请求传递给管道中的下一个中间件。这意味着中间件具有更广泛的控制能力,可以对整个应用程序的所有请求进行拦截和处理。
功能:中间件通常用于执行跨-cutting关注点的任务,比如错误处理、日志记录、身份验证、路由、静态文件服务等。它们可以读取、修改请求和响应对象,或者短路请求链,直接向客户端发送响应。
实现方式:中间件通常由一个或多个委托( Delegate )组成,这些委托会在应用程序启动时被添加到请求处理管道中。可以通过实现
IMiddleware
接口或使用中间件工厂方法来创建自定义中间件。
1.1.2 过滤器
位置与作用范围:过滤器则更加专注于MVC应用程序内部,特别是针对控制器和操作方法的请求处理流程。它们只在MVC处理请求的特定阶段生效,不会影响到非MVC路径的请求。
类型与功能:ASP.NET Core MVC支持多种类型的过滤器,包括但不限于:
IResourceFilter
和IAsyncResourceFilter
:最早和最晚执行的过滤器,用于资源级别的操作。IActionFilter
和IAsyncActionFilter
:在执行操作方法前后运行,可以用来修改操作参数或结果。IAuthorizationFilter
和IAsyncAuthorizationFilter
:用于处理授权逻辑。IExceptionFilter
和IAsyncExceptionFilter
:捕获并处理操作方法中抛出的异常。IResultFilter
和IAsyncResultFilter
:在执行操作结果之前和之后运行,可以用来修改结果或响应。
实现方式:过滤器可以通过实现相应的接口并应用特性(Attribute)到控制器或操作方法上来定义。也可以通过在Startup.cs的ConfigureServices方法中注册全局过滤器。
总结来说,中间件提供了对整个应用程序请求处理流程的低级控制,而过滤器则更加专注于MVC框架内的特定操作和控制器,提供了一种更细粒度的处理和干预方式。两者结合使用,可以构建出既强大又灵活的应用程序请求处理架构。
1.2 Asp.Net Core中有哪些内置过滤器,它们的调用顺序是怎样的
在ASP.NET MVC(包括ASP.NET Core MVC)框架中,过滤器是用来在特定的执行阶段插入自定义逻辑的组件。过滤器主要分为以下几种类型,并按照特定的顺序执行:
授权过滤器 (Authorization Filters): 这些过滤器首先执行,用于检查用户是否有权限执行接下来的操作。例如,可以在这里实现角色检查或者JWT令牌验证。
资源过滤器 (Resource Filters): 包括
IResourceFilter
和IAsyncResourceFilter
,它们在授权过滤器之后但在操作方法执行前运行。这些过滤器可用于执行一些早期或晚期的资源处理逻辑。操作过滤器 (Action Filters): 分为
IActionFilter
和IAsyncActionFilter
。操作过滤器在资源过滤器之后,在操作方法执行前后分别调用。它们常用于日志记录、修改操作参数或结果等。- OnActionExecuting: 在操作方法执行前调用。
- OnActionExecuted: 在操作方法执行后调用,无论操作是否成功。
结果过滤器 (Result Filters): 包括
IResultFilter
和IAsyncResultFilter
。这些过滤器在操作方法执行完毕且操作结果已知后调用,但在实际的结果执行之前或之后。- OnResultExecuting: 在操作结果执行前调用。
- OnResultExecuted: 在操作结果执行后调用。
异常过滤器 (Exception Filters): 如果在前面任何阶段发生未处理异常,
IExceptionFilter
或IAsyncExceptionFilter
将被执行,用于捕获和处理这些异常。如果在Action过滤器或Result过滤器中抛出了异常,也会执行这里的逻辑。
注意,如果在Action过滤器中抛出了异常,将不会执行Result过滤器,而是直接跳转到异常过滤器。此外,如果在同一个阶段注册了多个过滤器(例如,多个操作过滤器),它们将按照注册顺序执行。
过滤器可以在全局、控制器级别或操作方法级别应用,遵循的原则是:
- 控制器上的过滤器优先于方法上的过滤器。
- 同一级别的过滤器按照注册顺序执行。
这个顺序确保了从请求验证到最终响应生成的流程中,每个阶段都可以插入定制化的处理逻辑。
1.3 Asp.Net Core中有哪些中间件,它们的调用顺序是怎样的
1.3.1 内置中间件
ASP.NET Core 提供了一系列内置的中间件,这些中间件覆盖了从基本的请求处理到高级功能的广泛需求。以下是一些常用的内置中间件:
Static Files:用于提供网站的静态资源,如CSS、JavaScript和图像文件。
Routing:路由中间件,用于根据URL映射到具体的控制器和操作方法。
Authentication:身份验证中间件,支持多种认证方案,如Cookie、Bearer Tokens、OAuth等。
Authorization:授权中间件,用于控制对资源的访问权限。
Session:会话中间件,提供跨请求的数据存储支持。
Cors:跨源资源共享(CORS)中间件,允许服务器指定哪些来源的请求可以访问其资源。
Forwarded Headers:转发标头中间件,处理代理服务器和负载均衡器设置的HTTP标头。
Hsts:HTTP严格传输安全(HSTS)中间件,强制浏览器通过HTTPS与服务器通信。
Https Redirection:HTTPS重定向中间件,自动将HTTP请求重定向到HTTPS。
Response Caching:响应缓存中间件,用于缓存和重用常见的响应以提高性能。
Compression:压缩中间件,用于压缩HTTP响应体,减少网络传输量。
Developer Exception Page:开发者异常页面中间件,在开发环境中显示详细的错误信息。
ExceptionHandler:异常处理中间件,用于统一处理未被捕获的异常并返回友好的错误响应。
UseStatusCodePages:状态码页面中间件,自定义HTTP状态码页面。
Swagger / OpenAPI:虽然不是完全内置,但通过NuGet包可轻松集成,用于生成RESTful API的文档。
除了这些内置中间件,ASP.NET Core还支持开发自定义中间件,以满足特定应用程序的需求。自定义中间件可以通过实现IMiddleware
接口或使用Lambda表达式定义,来插入到请求处理管道中,实现高度定制化的功能处理。
1.3.2 调用顺序
ASP.NET Core 中内置中间件的调用顺序直接取决于你在 Startup.cs 文件的 Configure 方法中添加它们的顺序。当你使用 app.UseXXX 方法添加中间件时,它们会按照代码中从上到下的顺序被添加到请求处理管道中。
例如,如果你有以下的配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware<CustomMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
中间件的调用顺序将是:
- UseRouting: 配置路由相关的服务,这是处理路由的第一步,用于确定请求的终结点。
- UseAuthentication: 应用身份验证逻辑,尝试验证请求的身份。
- UseAuthorization: 应用授权逻辑,判断已认证的用户是否有权限访问请求的资源。
- UseMiddleware<CustomMiddleware>: 自定义中间件,按照你的逻辑执行。
- UseEndpoints: 配置终结点,这里是映射MVC控制器和操作方法或其他终结点,是管道中的最后一个环节,负责将请求分发到具体的处理程序。
请求会从上到下依次经过这些中间件,每个中间件可以选择是否将请求传递给管道中的下一个中间件。如果调用了 next
函数(或者在Lambda表达式中为 await next.Invoke()
),控制权就会传递给下一个中间件。响应时,流程会逆序返回,让每个中间件有机会处理响应。
因此,定义中间件的顺序对于安全性、性能和功能的实现至关重要。例如,身份验证和授权中间件通常需要放在处理具体请求逻辑的中间件之前。
1.4 使用中间件还是过滤器?如何选择
在Web开发中,过滤器(Filters)和中间件(Middleware)都是用于处理进入应用程序的HTTP请求和响应的组件,但它们在使用场景和功能定位上有所不同。
使用过滤器的情景:
细粒度操作控制:当你需要对特定的控制器或动作方法执行前后的处理逻辑进行控制时,如身份验证、授权、日志记录、修改模型绑定的输入或输出等,使用操作过滤器更为合适。
特定请求或响应处理:如果你的处理逻辑只与某个具体操作相关,例如格式化输出、异常处理等,使用操作过滤器或结果过滤器可以针对性地处理这些需求。
安全和认证:在需要对用户访问权限进行细致控制时,如基于角色的访问控制(RBAC),授权过滤器是非常有用的工具。
使用中间件的情景:
全局处理逻辑:当需要对所有进入应用的请求或响应进行统一处理时,比如跨域请求(CORS)设置、请求日志记录、错误处理、请求管道的初始化和终止等,中间件是更好的选择。
链式处理:中间件可以链接在一起形成请求处理管道,每个中间件可以决定是否将请求传递给管道中的下一个中间件,这使得它们非常适合执行一系列连续的处理步骤。
性能监控和优化:对于需要在整个应用层面监控请求性能或执行初步请求验证(如检查请求头)的场景,中间件提供了一个全局的介入点。
简而言之,过滤器更适合于处理与具体操作相关的细节逻辑,而中间件则更适用于全局性的、跨越多个控制器或操作的处理逻辑。 在设计应用程序架构时,理解两者之间的区别并合理搭配使用,可以有效提升应用的灵活性和可维护性。
dotnet学习笔记-专题06-过滤器和中间件-01的更多相关文章
- 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...
- 【Ext.Net学习笔记】06:Ext.Net GridPanel的用法(GridPanel 折叠/展开行、GridPanel Selection、 可编辑的GridPanel)
GridPanel 折叠/展开行 Ext.Net GridPanel的行支持折叠/展开功能,这个功能个人觉得还说很有用处的,尤其是数据中包含图片等内容的时候. 下面来看看效果: 使用行折叠/展开功能之 ...
- Duilib学习笔记《06》— 窗体基类WindowImpBase
在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...
- Django学习笔记之上下文处理器和中间件
上下文处理器 上下文处理器是可以返回一些数据,在全局模板中都可以使用.比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每个视图函数中都返回这个对象. 在set ...
- angular学习笔记(十六) -- 过滤器(2)
本篇主要介绍angular自定义的过滤器: 直接看例子: <!DOCTYPE html> <html ng-app="MyFilter"> <head ...
- angular学习笔记(十六) -- 过滤器(1)
本篇主要介绍过滤器的基本用法: 过滤器用来对数据进行格式的转换,数据格式的转化与逻辑无关,因此,我们使用过滤器来进行这些操作: {{... | filter2: 参数1,参数2... }} expre ...
- Qt5学习笔记(消息过滤器)
T06EventFilter.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgets gui MyWidget.h #i ...
- Vue学习笔记十:过滤器
目录 公共过滤器的写法 简易过滤器+带参数过滤器+多过滤器 私有过滤器 公共过滤器的写法 过滤器的写法还是很简单的 ,如下 <p>{{ msg | filtermsg }}</p&g ...
- Spring Security 学习笔记-授权控制过滤器
FilterSecurityInterceptor 是比较核心的过滤器,主要负责授权工作.SecurityMetadataSource 需要安全授权的元数据资源 AuthenticationMana ...
- Spring Security 学习笔记-登录认证过滤器
UsernamePasswordAuthenticationFilter用户登录验证过滤器,它继承自AbstractAuthenticationProcessingFilter. 登录处理url默认使 ...
随机推荐
- maven 打包 pom build
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframew ...
- Android 国际化:新增越南语语系(Java)
前提: 1. 在res文件夹中,新增values-vi文件夹(越南语文件夹) 2. 在步骤1的文件夹中,新增strings.xml 背景: 1. targetSdkVersion 29 2. Jdk ...
- libtool版本错配(libtool version mismatch)
当使用configure和makefile编译项目时,出现如下报错: libtool: Version mismatch error. This is libtool 2.4.6, but the`` ...
- 【笔记】node常用方法(持续更新)
1.path.basename(path[, ext]) path <string> ext <string> 可选的文件扩展名. 返回: <string> pat ...
- JavaScript – 小技巧 Tips
1e6 等价于 1 + 后面 6 个零 console.log(1e6 === 1_000_000); 模拟 C# 的 Record Deconstruct class Size implements ...
- .NET 7+Angular 4 轻量级新零售进销存系统
前言 给大家推荐一个专为新零售快消行业打造了一套高效的进销存管理系统. 系统不仅具备强大的库存管理功能,还集成了高性能的轻量级 POS 解决方案,确保页面加载速度极快,提供良好的用户体验. 项目介绍 ...
- MySQL笔记--数据库定时备份与恢复
利用crontab定时.利用mysqldump备份 编写sh启动脚本时记得赋予执行权限(x) 如果没有mysqldump命令执行,基于centos7 yum -y install mysql-clie ...
- npm install报错 SyntaxError: Unexpected end of JSON input while parsing near '...=GmVg\r\n-----END PGP'
解决方法: npm cache clean --force 然后重新执行:npm install即可
- day03-了解ajax
Ajax Ajax即Asynchronous Javascript And XML(异步JavaScript和XML). Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,这使得程 ...
- KubeSphere 在 vsleem 的落地实践
作者:方忠,苏州威视通智能科技有限公司技术经理,开源技术爱好者,长期活跃于 dromara 开源社区并参与贡献. 公司介绍 公司简介 苏州威视通智能科技有限公司,是一家全球领先的全景 AI 平台提供商 ...