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

升级Telerik Reports至2023 R3(Angular前端)后REST服务访问异常

问题解决方案

核心问题分析

升级Telerik报表组件版本后出现的REST服务访问失败,主要由以下几个关键问题导致:

  1. 自定义报表解析方法未正确重写框架接口
  2. 代码存在语法错误导致运行时异常
  3. 报表路径处理逻辑错误(尝试读取文件夹而非具体报表文件)
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:19:55