tnblog
首页
视频
资源
登录

.net core 过滤器中给控制器传递参数。.net6,.net 9过滤器控制器传参

112人阅读 2025/3/17 22:35 总访问:823851 评论:0 收藏:0 手机
分类: .net core


需求:在.net9的web 项目里边创建了一个过滤器,过滤器里边就是验证token,然后取出来token里边的数据,得到了一个CurrentUser对象,现在我想在控制器里边去获取这个对象,可以把过滤器里边创建的对象传递到控制器里边,比如我控制器里边有一个这样的属性:public CurrentUser currentUser { get; },需要把过滤器里边创建好的这个对象赋值给控制器里边的这个对象呢。

在 ASP.NET Core 中,将过滤器中解析的 CurrentUser 对象传递到控制器,可以通过以下两种主流方案实现:


方案 1:通过 HttpContext.Items 传递(推荐)

利用 HTTP 请求上下文的 Items 集合临时存储数据,这是 ASP.NET Core 中跨组件传递请求级数据的标准做法。

实现步骤:

  1. 在过滤器中存储对象

    1. public class JwtAuthorizationFilter : IAuthorizationFilter
    2. {
    3. public void OnAuthorization(AuthorizationFilterContext context)
    4. {
    5. // 解析 Token 并创建 CurrentUser 对象
    6. var loginUserInfo = ParseToken(context.HttpContext.Request.Headers["Authorization"]);
    7. // 将对象存入 HttpContext.Items
    8. context.HttpContext.Items["CurrentUser"] = loginUserInfo;
    9. }
    10. }
  2. 在控制器中通过属性获取

    1. public class MyController : ControllerBase
    2. {
    3. private CurrentUser _currentUser;
    4. public CurrentUser currentUser => _currentUser ??= HttpContext.Items["CurrentUser"] as CurrentUser;
    5. // 或者通过构造函数直接注入 IHttpContextAccessor
    6. private readonly IHttpContextAccessor _httpContextAccessor;
    7. public MyController(IHttpContextAccessor httpContextAccessor)
    8. {
    9. _httpContextAccessor = httpContextAccessor;
    10. }
    11. public IActionResult Get()
    12. {
    13. var user = _httpContextAccessor.HttpContext?.Items["CurrentUser"] as CurrentUser;
    14. // 使用 user...
    15. }
    16. }

优点

  • 无需修改依赖注入容器,简单直接。
  • 天然支持请求作用域,数据自动隔离。

缺点

  • 需要手动从 HttpContext.Items 中提取数据。

方案 2:通过依赖注入(Scoped 服务)

CurrentUser 注册为 Scoped 生命周期服务,在过滤器中动态替换实现。

实现步骤:

  1. 定义接口和默认实现

    1. public interface ICurrentUserAccessor
    2. {
    3. CurrentUser CurrentUser { get; }
    4. }
    5. public class CurrentUserAccessor : ICurrentUserAccessor
    6. {
    7. public CurrentUser CurrentUser { get; private set; }
    8. }
  2. Program.cs 中注册服务

    1. builder.Services.AddScoped<ICurrentUserAccessor, CurrentUserAccessor>();
  3. 在过滤器中替换服务实现

    1. public class JwtAuthorizationFilter : IAuthorizationFilter
    2. {
    3. public void OnAuthorization(AuthorizationFilterContext context)
    4. {
    5. var loginUserInfo = ParseToken(context.HttpContext.Request.Headers["Authorization"]);
    6. // 获取当前作用域的服务提供程序
    7. var scopedServiceProvider = context.HttpContext.RequestServices.CreateScope().ServiceProvider;
    8. var currentUserAccessor = scopedServiceProvider.GetRequiredService<ICurrentUserAccessor>();
    9. currentUserAccessor.CurrentUser = loginUserInfo;
    10. }
    11. }
  4. 在控制器中通过构造函数注入

    1. public class MyController : ControllerBase
    2. {
    3. private readonly ICurrentUserAccessor _currentUserAccessor;
    4. public CurrentUser currentUser => _currentUserAccessor.CurrentUser;
    5. public MyController(ICurrentUserAccessor currentUserAccessor)
    6. {
    7. _currentUserAccessor = currentUserAccessor;
    8. }
    9. }

优点

  • 符合依赖注入原则,控制器代码更简洁。
  • 便于单元测试(可模拟 ICurrentUserAccessor)。

缺点

  • 需要额外定义接口和实现类。
  • 需确保过滤器在作用域内正确替换服务。

选择建议

  • 简单场景:优先使用 HttpContext.Items,无需额外配置。
  • 复杂逻辑或需强类型访问:选择依赖注入方案,代码更规范。

两种方案均能安全传递请求级数据,根据你的项目复杂度选择即可。**


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core中使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...
这一生多幸运赶上过你.
排名
8
文章
221
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术