AspNetCore.Reporting库存在缓存问题,多报表请求报索引越界求解决方案
AspNetCore.Reporting多报表切换Index Out of bound异常解决方案
根因说明
AspNetCore.Reporting底层默认会缓存首次加载的ReportDefinition报表结构,若复用同一个报表实例加载不同结构的报表,旧缓存的结构索引和新报表的列、参数、数据源配置不匹配,就会触发数组越界异常。
修复方案
- 每次请求新建独立报表实例
不要使用全局静态的LocalReport单例对象,每次请求报表时单独初始化全新实例,从根源避免缓存冲突:public IActionResult ExportReport(string reportKey) { // 每次请求新建实例,不要复用全局对象 var localReport = new LocalReport(); localReport.ReportPath = Path.Combine("Reports", $"{reportKey}.rdlc"); // 绑定当前报表对应数据源 localReport.AddDataSource("DataSet1", GetReportData(reportKey)); // 执行渲染导出逻辑 var result = localReport.Execute(RenderType.Pdf, 1); return File(result.MainStream, "application/pdf"); } - 复用实例前手动重置缓存
若业务场景需要复用报表实例,加载新报表前必须调用Reset()方法清空所有残留缓存:// 加载新报表前先执行重置 localReport.Reset(); // 再加载新报表配置 localReport.ReportPath = "new_report.rdlc"; localReport.AddDataSource("DataSet1", newData); - 调整DI注入的服务生命周期
若通过依赖注入注入报表服务,不要注册为Singleton单例,改为瞬时Transient或者作用域Scoped生命周期:// Program.cs 注册逻辑 builder.Services.AddTransient<LocalReport>(); - 校验数据源匹配度
加载不同报表前确认传入的数据源列名、字段顺序、数据行数和当前rdlc报表的定义完全匹配,排除数据源本身的索引不匹配问题。
效果验证
修改完成后依次请求多份结构不同的报表,确认均可以正常加载导出,且单份报表的原有功能不受影响。
内容的提问来源于stack exchange,提问作者Dawood Jamil
相关产品推荐
相关产品推荐

