You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET使用IDataProtector加密URL参数ID出现空引用错误如何解决

问题根因

你遇到的空引用错误本质是protector字段未被正确初始化,直接触发原因是你写了两个控制器构造函数:

  • 当ASP.NET框架实例化控制器时,如果依赖注入配置不完整,会优先调用无参构造函数,此时protector字段完全没有被赋值,调用Protect方法时自然触发空引用异常。
  • 就算走了带参构造函数,如果你的IDataProtectionProvider和DataPro没有在DI容器中注册,也会导致构造参数为空,最终protector还是null。

修复步骤

  • 第一步:直接删除无参构造函数,强制框架走带参的依赖注入构造逻辑
// 直接删除整个无参构造方法
public QRScanningController()
{
    //protector = dataProtectionProvider.Create(dataPro.EmpIdRoutValue);
}
  • 第二步:在服务注册入口添加对应服务的注册逻辑:
    如果是ASP.NET Core,在Program.cs中添加如下代码:
// 注册数据保护服务
builder.Services.AddDataProtection();
// 注册你的自定义DataPro类,可根据业务需求调整生命周期为Scoped/Transient
builder.Services.AddSingleton<DataPro>();

如果是.NET Framework版本的ASP.NET MVC,需要在你使用的DI容器(比如Autofac、Unity)中注册对应服务。

  • 第三步:优化Index方法的代码,IDataProtector原生支持字符串参数的加密方法,无需手动转字节:
public ActionResult Index()
{
    DataPro dataProobj = new DataPro();
    dataProobj.id = 12131;
    // 直接调用字符串重载的Protect方法即可
    dataProobj.encID = protector.Protect(dataProobj.id.ToString());
    return View(dataProobj);
}

注意:确保你注入的DataPro实例中的EmpIdRoutValue属性已经提前赋值,否则dataProtectionProvider.Create方法也会抛出参数异常。

内容的提问来源于stack exchange,提问作者Noha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 18:21:01