如何解决.NET 5迁移后AlanJuden MvcReportViewer报MissingMethodException问题
解决方案
根因说明
AlanJudenMvcReportViewer原生基于.NET Core 2.1开发,其基类ReportController中调用的Json(object, Newtonsoft.Json.JsonSerializerSettings)重载在.NET Core 3.0及后续版本(包含.NET 5)中被移除,.NET默认改为使用System.Text.Json作为序列化组件,因此触发MissingMethodException异常。
方案一:重写父类方法(无需修改源码,优先推荐)
你不需要修改Nuget包的源码,直接在你自己的ReportController中重写父类的同名方法,覆盖原有逻辑即可:
- 将以下代码添加到你的
ReportController类中:
/// <summary> /// 重写父类ViewReportPage方法,适配.NET 5的序列化规则 /// </summary> public new ActionResult ViewReportPage(string reportPath, int page = 1) { var model = GetReportViewerModel(Request); model.ReportPath = reportPath; var reportResult = RunReport(model, page); // 使用.NET 5自带的System.Text.Json序列化 return Json(reportResult, new System.Text.Json.JsonSerializerOptions { // 保留属性名原大小写,避免前端JS无法匹配字段 PropertyNamingPolicy = null, // 取消特殊字符转义,避免中文、符号显示异常 Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); }
- 如果后续调用
ReloadParameters、FindStringInReport接口也出现同款报错,用同样逻辑重写对应方法即可,只需把返回值的Json参数替换为上述System.Text.Json.JsonSerializerOptions配置。
方案二:修复Newtonsoft.Json配置(解决你之前配置不生效的问题)
你之前方案2失效大概率是配置位置不对,按以下步骤修正:
- 确保安装对应版本的Nuget包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson,版本号必须选择5.x.x,匹配你的.NET 5 runtime版本。 - 打开
Startup.cs,找到ConfigureServices方法,如果你迁移后使用的是默认的AddControllersWithViews(而非旧版的AddMvc),按以下方式配置:
// 旧写法如果是services.AddMvc().AddNewtonsoftJson(),大概率不生效,替换为下面的写法 services.AddControllersWithViews() .AddNewtonsoftJson(options => { // 可选配置:保持和原序列化规则一致,避免属性名大小写问题 options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); });
- 清理解决方案、删除bin和obj文件夹后重新编译运行即可。
备选方案:直接引用源码修改
如果上述两个方案都无法生效,可以直接将AlanJudenMvcReportViewer的源码下载到你的解决方案中,移除原Nuget包引用改为项目引用,直接修改源码中ReportController里的Json方法参数即可。
内容的提问来源于stack exchange,提问作者Rod Foulcher
相关产品推荐
相关产品推荐

