升级Telerik Reports至2023 R3(Angular前端)后REST服务访问异常
问题解决方案
核心问题分析
升级Telerik报表组件版本后出现的REST服务访问失败,主要由以下几个关键问题导致:
- 自定义报表解析方法未正确重写框架接口
- 代码存在语法错误导致运行时异常
- 报表路径处理逻辑错误(尝试读取文件夹而非具体报表文件)
- CORS配置可能未覆盖新版本服务的请求要求
分步修复方案
1. 修复报表解析方法的实现
新版本Telerik Web API报表控制器要求Resolve方法必须**重写(override)**基类的对应方法,同时需正确处理报表文件路径:
using System; using System.Collections.Generic; using System.IO; using System.Web.Http; using Telerik.Reporting.Cache.Interfaces; using Telerik.Reporting.Services.WebApi; using System.Web; using Telerik.Reporting.Services; using Telerik.Reporting; using System.Web.Http.Cors; namespace SynWAPI.Controllers { [EnableCors(origins: "*", headers: "*", methods: "*")] // 替换自定义CORS属性,使用官方实现 [RoutePrefix("api/reports")] public class ReportsController : ReportsControllerBase { [HttpGet] [Route("IsReady")] public IHttpActionResult IsReady() { return Ok("OK Dude !"); } // 重写基类的Resolve方法,正确实现报表解析逻辑 public override ReportSource Resolve(string uri, OperationOrigin operationOrigin, IDictionary<string, object> currentParameterValues) { var appPath = HttpContext.Current.Server.MapPath("~/"); // 根据传入的uri参数拼接具体报表文件路径(uri应为报表文件名,如"StatisticsReport.trdp") string reportFilePath = Path.Combine(appPath, "Reports", uri); if (!File.Exists(reportFilePath)) { throw new FileNotFoundException($"指定报表文件不存在: {reportFilePath}"); } var reportPackager = new ReportPackager(); using (var sourceStream = File.OpenRead(reportFilePath)) { var report = (Report)reportPackager.UnpackageDocument(sourceStream); return new InstanceReportSource { ReportDocument = report }; } } // 如果不需要完全自定义解析,也可以恢复官方推荐的解析器实现(兼容旧逻辑) // protected override IReportSourceResolver CreateReportSourceResolver() // { // var appPath = HttpContext.Current.Server.MapPath("~/"); // var reportsPath = Path.Combine(appPath, "Reports"); // return new ReportFileResolver(reportsPath).AddFallbackResolver(new ReportTypeResolver()); // } protected override ICache CreateCache() { return Telerik.Reporting.Services.Engine.CacheFactory.CreateFileCache(); } } }
2. 修正代码语法错误
原代码中var appPath = HttpContext.Current.Server.MapPath("~/";缺少闭合括号,已在上述修复代码中修正为var appPath = HttpContext.Current.Server.MapPath("~/");。
3. 统一配置CORS
替换自定义的[AllowCrossSiteJson]属性,使用Web API官方的[EnableCors]属性,并在全局配置中启用CORS:
在WebApiConfig.cs中添加:
using System.Web.Http; using System.Web.Http.Cors; public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 全局启用CORS(生产环境建议指定具体允许的域名,而非"*") var corsSettings = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(corsSettings); // 其他Web API路由配置 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
4. 验证与排查步骤
- 验证服务可用性:先测试
GET http://oak-3cvrvv3/HarAPI/api/reports/IsReady,确认服务能正常响应。 - 测试核心端点:用Postman调用
POST http://oak-3cvrvv3/HarAPI/api/reports/clients,查看是否返回正常的clientId。若仍报错,检查服务器应用日志(如IIS日志、Windows事件查看器)获取具体异常信息。 - 确认路径正确性:检查
Reports文件夹是否存在于Web应用根目录下,且包含对应的报表文件(.trdp/.trdx格式)。 - 核对前端配置:确保前端报表查看器的
serviceUrl与后端路由完全一致,无拼写或协议(http/https)差异。
内容的提问来源于stack exchange,提问作者bob.mazzo
相关产品推荐
相关产品推荐

