找回密码
 立即注册

QQ登录

只需一步,快速开始

Popeye

注册会员

5

主题

26

帖子

65

积分

注册会员

积分
65
Popeye
注册会员   /  发表于:2021-8-14 15:53  /   查看:3588  /  回复:7
10金币
本帖最后由 Crystal.Li 于 2021-8-16 10:26 编辑

Web端报表设计器的预览提示“未找到报表文件”

我实现了 IResourcesService 接口,因为我需要将报表资源存储在数据库中和阿里云OSS中,开发完成后,设计器的文件和报表设计功能是都可正常工作,但是当点击设计器左上角的“预览”按钮之后,报表设计器提示“未找到报表文件 xxx.rdlx”。
跟踪浏览器的网络请求,发现设计器发起了一个 GET 请求,地址是:
/reports/xxxx.rdlx/info,而该请求返回的HTTP状态码为404,故而导致报表设计器提示“未找到报表文件 xxx.rdlx”。


请问,是我遗漏了什么吗?!

最佳答案

查看完整内容

这个问题的原因找到了,原来是因为 GrapeCity 报表服务内置路由的配置问题。我的设计器的配置如下: 但是JS端的 GrapceCity.ActiveReports.JSViewer.create(...) 的配置项未同步设置其 `reportService.url` 对应的值,因此导致报表服务的内置API未能匹配,即404状态。 注意:不要用 settings.Prefix=string.Empty 来设置空前缀,应该显式指定具体的前缀值,以避免 GrapeCity 内部对空或空字符串的默认处理规则。 ...

7 个回复

正序浏览
James.Lv讲师达人认证 悬赏达人认证 活字格认证 Wyn认证
超级版主   /  发表于:2021-8-26 11:57:51
8#
Popeye 发表于 2021-8-26 11:52
这个问题的原因找到了,原来是因为 GrapeCity 报表服务内置路由的配置问题。我的设计器的配置如下:

但 ...

回复 使用道具 举报
Crystal.Li讲师达人认证 悬赏达人认证
论坛元老   /  发表于:2021-8-16 17:03:56
6#
您使用的什么版本的AR?可以把断点加在这部分调试看一下,读取到的报表文件路径去哪里了:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Popeye
注册会员   /  发表于:2021-8-16 14:54:40
5#
本帖最后由 Popeye 于 2021-8-16 14:58 编辑
Crystal.Li 发表于 2021-8-16 14:24
您把您的startUp函数配置路由这部分截图看看,这个报404就是报表文件没找到,应该就是路由问题。

因为报表的Viewer是正常可以查看的,只是在Designer中无法预览(Designer是可以打开编辑)。注册的代码如下:
  1. var reportService = app.ApplicationServices.Resolve<Designing.ResourceService>();

  2. app.UseReporting(settings =>
  3. {
  4.     settings.UseCompression = true;
  5.     settings.UseCustomStore(reportService.GetReport);
  6.     settings.LocateDataSource = GetData;
  7.     settings.SetLocateDataSource(GetData);
  8. });

  9. app.UseDesigner(settings =>
  10. {
  11.     settings.Prefix = string.Empty;
  12.     settings.UseCustomStore(reportService);
  13. });
复制代码
该类完整代码文件的开源地址是:https://github.com/Zongsoft/Framework/blob/master/externals/grapecity/src/api/Reporting/WebApplicationInitializer.cs




回复 使用道具 举报
Crystal.Li讲师达人认证 悬赏达人认证
论坛元老   /  发表于:2021-8-16 14:24:02
4#
您把您的startUp函数配置路由这部分截图看看,这个报404就是报表文件没找到,应该就是路由问题。
回复 使用道具 举报
Popeye
注册会员   /  发表于:2021-8-16 14:07:02
3#
Crystal.Li 发表于 2021-8-16 10:30
这个应该是路由问题,您参考这个帖子看看有帮助吗:
https://gcdn.grapecity.com.cn/forum.php?mod=redire ...

应该不是路由的问题,因为上面报表设计器发出的GET请求地址是:/reports/xxxx.rdlx/info 没有出现任何转义。
回复 使用道具 举报
Crystal.Li讲师达人认证 悬赏达人认证
论坛元老   /  发表于:2021-8-16 10:30:00
2#
这个应该是路由问题,您参考这个帖子看看有帮助吗:
https://gcdn.grapecity.com.cn/fo ... 2&fromuid=59070
回复 使用道具 举报
最佳答案
最佳答案
Popeye
注册会员   /  发表于:2021-8-14 15:53:40
来自 7#
这个问题的原因找到了,原来是因为 GrapeCity 报表服务内置路由的配置问题。我的设计器的配置如下:
  1. var reportService = app.ApplicationServices.Resolve<Designing.ResourceService>();

  2. app.UseDesigner(settings =>
  3. {
  4.     settings.Prefix = string.Empty;
  5.     settings.UseCustomStore(reportService);
  6. });
复制代码

但是JS端的 GrapceCity.ActiveReports.JSViewer.create(...) 的配置项未同步设置其
`reportService.url` 对应的值,因此导致报表服务的内置API未能匹配,即404状态。
注意:不要用 settings.Prefix=string.Empty 来设置空前缀,应该显式指定具体的前缀值,以避免 GrapeCity 内部对空或空字符串的默认处理规则。


解决办法:
为了避免内置API的路径与自有业务系统API的路径冲突,将预览器与设计器的路由前缀统一。如下所示:
详细代码位于:https://github.com/Zongsoft/Framework/blob/master/externals/grapecity/src/api/Reporting/WebApplicationInitializer.cs

  1. var reportService = app.ApplicationServices.Resolve<Designing.ResourceService>();

  2. app.UseReporting(settings =>
  3. {
  4.     settings.Prefix = "/Grapecity/Reporting";
  5.     settings.UseCompression = true;
  6.     settings.UseCustomStore(reportService.GetReport);
  7.     settings.LocateDataSource = GetData;
  8.     settings.SetLocateDataSource(GetData);
  9. });

  10. app.UseDesigner(settings =>
  11. {
  12.     settings.Prefix = "/Grapecity/Reporting";
  13.     settings.UseCustomStore(reportService);
  14. });
复制代码
于此同时,必须将JS端的代码同步更新,大致如下:
  1. var designerOptions = GrapeCity.ActiveReports.WebDesigner.createDesignerOptions();
  2. designerOptions.server.url = "/grapecity/reporting";

  3. designerOptions.openViewer = function(options) {
  4.     if(viewer) {
  5.         viewer.openReport(options.reportInfo.id);
  6.         return;
  7.     }

  8.     viewer = GrapeCity.ActiveReports.JSViewer.create({
  9.         locale: options.locale,
  10.         element: '#' + options.element,
  11.         reportService: {
  12.             url: '/grapecity/reporting',
  13.         },
  14. };
复制代码


评分

参与人数 1金币 +1000 收起 理由
James.Lv + 1000 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部