Popeye 发表于 2021-8-14 15:53:39

在Web报表设计器中预览时提示"未找到报表文件"

本帖最后由 Crystal.Li 于 2021-8-16 10:26 编辑

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

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


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

Popeye 发表于 2021-8-14 15:53:40

这个问题的原因找到了,原来是因为 GrapeCity 报表服务内置路由的配置问题。我的设计器的配置如下:
var reportService = app.ApplicationServices.Resolve<Designing.ResourceService>();

app.UseDesigner(settings =>
{
    settings.Prefix = string.Empty;
    settings.UseCustomStore(reportService);
});

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


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

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

app.UseReporting(settings =>
{
    settings.Prefix = "/Grapecity/Reporting";
    settings.UseCompression = true;
    settings.UseCustomStore(reportService.GetReport);
    settings.LocateDataSource = GetData;
    settings.SetLocateDataSource(GetData);
});

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

designerOptions.openViewer = function(options) {
    if(viewer) {
      viewer.openReport(options.reportInfo.id);
      return;
    }

    viewer = GrapeCity.ActiveReports.JSViewer.create({
      locale: options.locale,
      element: '#' + options.element,
      reportService: {
            url: '/grapecity/reporting',
      },
};


Crystal.Li 发表于 2021-8-16 10:30:00

这个应该是路由问题,您参考这个帖子看看有帮助吗:
https://gcdn.grapecity.com.cn/forum.php?mod=redirect&goto=findpost&ptid=92644&pid=381922&fromuid=59070

Popeye 发表于 2021-8-16 14:07:02

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 14:24:02

您把您的startUp函数配置路由这部分截图看看,这个报404就是报表文件没找到,应该就是路由问题。

Popeye 发表于 2021-8-16 14:54:40

本帖最后由 Popeye 于 2021-8-16 14:58 编辑

Crystal.Li 发表于 2021-8-16 14:24
您把您的startUp函数配置路由这部分截图看看,这个报404就是报表文件没找到,应该就是路由问题。
因为报表的Viewer是正常可以查看的,只是在Designer中无法预览(Designer是可以打开编辑)。注册的代码如下:
var reportService = app.ApplicationServices.Resolve<Designing.ResourceService>();

app.UseReporting(settings =>
{
    settings.UseCompression = true;
    settings.UseCustomStore(reportService.GetReport);
    settings.LocateDataSource = GetData;
    settings.SetLocateDataSource(GetData);
});

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


static/image/hrline/1.gif


[*]我们的项目是开源的,Grapecity完整的实现项目源码地址:https://github.com/Zongsoft/Framework/tree/master/externals/grapecity
[*]一些有关报表相关的基类和公共接口的定义位于这个项目:https://github.com/Zongsoft/Framework/tree/master/Zongsoft.Reporting

Crystal.Li 发表于 2021-8-16 17:03:56

您使用的什么版本的AR?可以把断点加在这部分调试看一下,读取到的报表文件路径去哪里了:

James.Lv 发表于 2021-8-26 11:57:51

Popeye 发表于 2021-8-26 11:52
这个问题的原因找到了,原来是因为 GrapeCity 报表服务内置路由的配置问题。我的设计器的配置如下:

但 ...

:hjyzw:
页: [1]
查看完整版本: 在Web报表设计器中预览时提示"未找到报表文件"