设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

查看: 547|回复: 0

ASP.NET Core中ResourceFilter过滤器的实现

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:2
  • 打卡月天数:0
  • 打卡总奖励:31
  • 最近打卡:2025-04-09 14:46:37
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
33
主题
25
精华
0
金钱
126
积分
62
注册时间
2023-10-3
最后登录
2025-8-31

发表于 2025-8-31 13:59:41 | 显示全部楼层 |阅读模式

在现代 Web 开发中,ASP.NET Core 提供了强大的过滤器(Filters)机制,用于在处理请求的不同阶段执行特定的代码逻辑。ASP.NET Core 中的 

  1. ResourceFilter
复制代码
 是一种非常有用的过滤器类型,允许开发人员在请求到达控制器操作方法之前或响应返回之前执行一些操作。在本文中,我们将详细解析 
  1. ResourceFilter
复制代码
,介绍它的工作原理、使用场景以及如何在实际项目中运用它。

1. 什么是 ResourceFilter?

1.1 过滤器概述

ASP.NET Core 的过滤器是用于在请求和响应处理的不同阶段执行自定义逻辑的一种机制。过滤器在控制器方法执行之前、之后,或者在异常发生时执行。它们可以帮助开发人员对请求进行验证、处理、修改或者进行其他操作。常见的过滤器类型包括:

  • Authorization Filters(授权过滤器):用于身份验证和授权操作。
  • Resource Filters(资源过滤器):用于资源级的处理,例如缓存、日志记录等。
  • Action Filters(操作过滤器):用于在控制器动作执行之前和之后执行一些操作。
  • Result Filters(结果过滤器):用于在控制器动作返回结果后但在返回响应之前进行操作。
  • Exception Filters(异常过滤器):用于处理在请求处理过程中发生的异常。

在这些过滤器中,

  1. ResourceFilter
复制代码
 是最早在请求管道中执行的过滤器之一,通常用于处理一些资源相关的操作,比如缓存管理、日志记录等。

1.2 ResourceFilter 的生命周期

  1. ResourceFilter
复制代码
 主要有两个方法,它们分别在请求处理的不同阶段执行:

    1. OnResourceExecuting
    复制代码
    :当请求到达控制器操作方法之前执行。此时请求已经经过了路由和模型绑定,但还未执行控制器操作方法。在这里,我们可以处理一些请求级别的资源,如缓存、身份验证检查等。

    1. OnResourceExecuted
    复制代码
    :当控制器操作方法执行完毕并生成响应之后,响应还没有返回客户端时执行。此时可以执行一些响应后的处理,比如日志记录、缓存处理等。

2. 如何实现 ResourceFilter?

2.1 实现 IResourceFilter 接口

要实现自定义的 

  1. ResourceFilter
复制代码
,你需要实现 
  1. IResourceFilter
复制代码
 接口或继承 
  1. ResourceFilterAttribute
复制代码
 类。
  1. IResourceFilter
复制代码
 接口包含两个方法:
  1. OnResourceExecuting
复制代码
 和 
  1. OnResourceExecuted
复制代码
,你可以在这些方法中定义需要在请求生命周期中的不同阶段执行的操作。

示例:实现一个简单的日志记录过滤器

假设我们需要创建一个 

  1. ResourceFilter
复制代码
,用于记录请求的开始和结束时间。下面是一个简单的实现:

  1. using Microsoft.AspNetCore.Mvc.Filters;
  2. using Microsoft.Extensions.Logging;
  3. using System;
  4. public class LogResourceFilter : IResourceFilter
  5. {
  6. private readonly ILogger<LogResourceFilter> _logger;
  7. public LogResourceFilter(ILogger<LogResourceFilter> logger)
  8. {
  9. _logger = logger;
  10. }
  11. // 请求开始时执行
  12. public void OnResourceExecuting(ResourceExecutingContext context)
  13. {
  14. _logger.LogInformation($"Request started at {DateTime.Now}");
  15. }
  16. // 请求结束时执行
  17. public void OnResourceExecuted(ResourceExecutedContext context)
  18. {
  19. _logger.LogInformation($"Request ended at {DateTime.Now}");
  20. }
  21. }
复制代码

在这个示例中,

  1. LogResourceFilter
复制代码
 记录了每个请求的开始和结束时间。
  1. OnResourceExecuting
复制代码
 方法在请求处理开始时执行,而 
  1. OnResourceExecuted
复制代码
 方法则在请求处理结束后执行。

2.2 将 ResourceFilter 应用于控制器或方法

创建了 

  1. LogResourceFilter
复制代码
 之后,接下来需要将它应用到控制器或具体的方法上。你可以使用 
  1. ServiceFilter
复制代码
 或 
  1. TypeFilter
复制代码
 特性来应用 
  1. ResourceFilter
复制代码

应用于整个控制器

  1. [ServiceFilter(typeof(LogResourceFilter))]
  2. public class HomeController : Controller
  3. {
  4. public IActionResult Index()
  5. {
  6. return View();
  7. }
  8. }
复制代码

应用于控制器方法

  1. public class HomeController : Controller
  2. {
  3. [ServiceFilter(typeof(LogResourceFilter))]
  4. public IActionResult Index()
  5. {
  6. return View();
  7. }
  8. }
复制代码

通过这种方式,你可以确保 

  1. LogResourceFilter
复制代码
 在请求进入控制器方法之前和之后都能执行日志记录操作。

2.3 使用依赖注入

  1. ResourceFilter
复制代码
 可以依赖注入到控制器或方法中。在 ASP.NET Core 中,依赖注入非常重要,可以让你轻松地管理对象的生命周期。

首先,在 

  1. ConfigureServices
复制代码
 方法中注册 
  1. LogResourceFilter
复制代码

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. // 注册自定义的 ResourceFilter
  4. services.AddScoped<LogResourceFilter>();
  5. services.AddControllersWithViews();
  6. }
复制代码

然后使用 

  1. ServiceFilter
复制代码
 特性将 
  1. LogResourceFilter
复制代码
 应用到控制器或方法。

3. ResourceFilter 的使用场景

  1. ResourceFilter
复制代码
 通常用于一些全局的、与请求资源处理相关的操作。以下是一些典型的应用场景:

3.1 缓存处理

你可以在 

  1. OnResourceExecuting
复制代码
 方法中检查请求是否已经被缓存,并返回缓存的结果,避免重复的资源处理。在 
  1. OnResourceExecuted
复制代码
 方法中,你可以对响应进行缓存处理。

示例:简单的缓存检查

  1. public class CacheResourceFilter : IResourceFilter
  2. {
  3. public void OnResourceExecuting(ResourceExecutingContext context)
  4. {
  5. // 检查是否有缓存的结果
  6. var cachedResult = CheckCache(context.HttpContext.Request);
  7. if (cachedResult != null)
  8. {
  9. context.Result = cachedResult; // 如果有缓存,直接返回缓存结果
  10. }
  11. }
  12. public void OnResourceExecuted(ResourceExecutedContext context)
  13. {
  14. // 如果没有缓存,可以将结果缓存
  15. if (context.Result != null)
  16. {
  17. AddToCache(context.HttpContext.Request, context.Result);
  18. }
  19. }
  20. private object CheckCache(Microsoft.AspNetCore.Http.HttpRequest request)
  21. {
  22. // 这里是检查缓存的逻辑
  23. return null; // 示例中返回 null,实际应该根据请求来检查缓存
  24. }
  25. private void AddToCache(Microsoft.AspNetCore.Http.HttpRequest request, object result)
  26. {
  27. // 将结果添加到缓存
  28. }
  29. }
复制代码

3.2 日志记录

你可以在请求开始时记录请求的信息,在请求结束时记录响应的状态。这对于监控和调试非常有帮助。

3.3 跨域资源共享(CORS)

在请求到达控制器方法之前,你可以通过 

  1. ResourceFilter
复制代码
 设置跨域资源共享(CORS)策略,动态控制哪些源可以访问你的资源。

3.4 授权检查

尽管通常授权检查是由 

  1. AuthorizationFilter
复制代码
 来完成的,但你也可以在 
  1. ResourceFilter
复制代码
 中进行一些额外的验证。比如,根据请求的路径、参数或头信息做一些自定义的权限校验。

4. ResourceFilter 与其他过滤器的对比

  1. ResourceFilter
复制代码
 是在请求管道中最早执行的过滤器之一,它通常用于处理资源相关的操作。而其他过滤器如 
  1. ActionFilter
复制代码
 和 
  1. AuthorizationFilter
复制代码
 通常在请求处理的其他阶段执行。

    1. ResourceFilter
    复制代码
    :用于处理资源级的操作,如缓存、日志记录、跨域设置等。

    1. ActionFilter
    复制代码
    :用于在控制器方法执行前后执行操作,通常用于修改请求或响应数据,或者执行业务逻辑。

    1. AuthorizationFilter
    复制代码
    :用于身份验证和授权操作,确保请求具有适当的权限。

    1. ExceptionFilter
    复制代码
    :用于捕获异常并进行处理。

  1. ResourceFilter
复制代码
 通常用于请求级别的预处理操作,而 
  1. ActionFilter
复制代码
 则用于处理与具体操作方法相关的任务。

5. 总结

  1. ResourceFilter
复制代码
 是 ASP.NET Core 中非常强大的一种过滤器类型,它允许开发人员在请求处理的早期阶段(控制器方法执行之前)进行资源级的处理。通过实现 
  1. IResourceFilter
复制代码
 接口,开发人员可以在请求到达控制器前后执行自定义逻辑,如缓存管理、日志记录、跨域资源共享等。由于 
  1. ResourceFilter
复制代码
 在请求管道中执行的优先级较高,因此它非常适用于一些全局的资源处理操作。

掌握 

  1. ResourceFilter
复制代码
 的使用,可以帮助你更好地控制请求的生命周期,提升应用的性能和可维护性。

到此这篇关于 ASP.NET Core中ResourceFilter过滤器的实现的文章就介绍到这了,更多相关 ASP.NET Core ResourceFilter过滤器内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表