.NET Core中如何为IAntiforgery和IHttpContextAccessor创建实例
问题解决说明
你遇到的实例为null的问题是因为没有将对应服务注册到ASP.NET Core的依赖注入(DI)容器中,这两个接口不需要你手动实例化实现类,框架已经内置了完整的实现和注册逻辑:
1. 接口对应默认实现(仅作了解,不推荐手动实例化)
IAntiforgery的默认实现类为Microsoft.AspNetCore.Antiforgery.AntiforgeryIHttpContextAccessor的默认实现类为Microsoft.AspNetCore.Http.HttpContextAccessor
注意:手动new实现类需要自行处理所有依赖项(比如Antiforgery还依赖配置项、日志服务、令牌存储服务等),复杂度极高,完全不推荐这种操作。
2. 正确的使用方式(通过DI容器注入)
步骤1:注册服务到容器
在你的项目启动文件Program.cs中添加以下注册代码(.NET 6及以上版本):
var builder = WebApplication.CreateBuilder(args); // 注册IHttpContextAccessor服务 builder.Services.AddHttpContextAccessor(); // 注册Antiforgery服务,如果已经注册了AddControllersWithViews/AddRazorPages可省略,框架会默认注册 builder.Services.AddAntiforgery(); // 注册你自己编写的令牌处理类,生命周期根据你的业务场景选Scoped/Transient/Singleton builder.Services.AddScoped<你的令牌处理类名>(); // 其他原有服务注册代码... var app = builder.Build(); // 其他中间件配置... app.Run();
步骤2:修改你的类代码,通过构造函数注入依赖
你原有代码的字段没有通过构造函数赋值,也没有做空值校验,修正后的参考代码:
public class 你的令牌处理类名 { private readonly IAntiforgery _antiforgery; private readonly IHttpContextAccessor _httpContextAccessor; // 构造函数参数由DI容器自动注入,不需要手动传值 public 你的令牌处理类名(IAntiforgery antiforgery, IHttpContextAccessor httpContextAccessor) { _antiforgery = antiforgery; _httpContextAccessor = httpContextAccessor; } private void GenerateToken() { // 先判断HttpContext是否存在,避免空引用异常 if (_httpContextAccessor.HttpContext != null) { _antiforgery.GetAndStoreTokens(_httpContextAccessor.HttpContext); } } }
步骤3:获取你的类的实例
不要手动new你的令牌处理类,同样通过DI注入获取实例,比如在Controller中使用:
public class TestController : ControllerBase { private readonly 你的令牌处理类名 _tokenHelper; public TestController(你的令牌处理类名 tokenHelper) { _tokenHelper = tokenHelper; } // 你的接口方法里直接调用即可 [HttpGet] public IActionResult GetToken() { _tokenHelper.GenerateToken(); return Ok(); } }
内容的提问来源于stack exchange,提问作者balajivaishnav
相关产品推荐
相关产品推荐

