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
相关产品推荐
相关产品推荐

