2009-09-15 53 views
12

是否可以创建一个自定义的Web前端来运行SSRS报告?带自定义Web UI的SSRS

我们有一个现有的跨浏览器Web前端,用于收集报告输入(对于非SSRS平台),我们将看成继续使用SSRS。它包括已经在内部开发的特定于域的UI控件,并且没有任何内容与SSRS紧密相关。

我们不需要做类型感知控件的动态呈现 - 尽管我想RDL可以帮助告诉我们报告需要什么参数(以及它们的类型) - 但是我们的确需要比Report Manager提供的更多的东西。

本质上,我们想定制/替换报表管理器生成的输入收集UI。我们也需要一些小小的品牌。将报告管理器完全取消(我的意思是外部)并通过我们自己的ASP.NET应用程序直接与SSRS Web服务进行交互会更容易吗?

我是新来的报道地形,我找不到任何有关这方面的信息。我们正在使用SQL Server 2005 Reporting Services。

+0

嗨,你是怎么结束了这一点,我试图做同样的事情,但我必须要提供tenantId在后面的代码,否则将在泄漏的安全的数据来验证,但不对客户的风险,有什么想法吗 ?谢谢 – Mathematics 2016-02-19 16:05:34

回答

9

是的,这是可能的。我们在两年前实施了一个与此类似的解决方案,当时我们对OOTB的参数选择感到不满。

基本上我们有一个用户交互的自定义​​ASP.NET应用程序。当第一页加载时,会显示该用户可用的报告列表(通过Web服务从ASP.NET应用程序到SSRS的通信以及身份模拟,以便列表被安全修剪)。如果自定义ASP.NET应用程序位于与报表服务器不同的服务器上,则需要在这里使用Kerberos。

用户选择报表后,会显示参数选择屏幕(仍位于自定义ASP.NET应用程序中)。当他们选择参数并单击“生成报告”时,某些JavaScript会将每个参数的输入标记随时添加到HTML表单(隐藏于用户),然后执行HTTP POST到SSRS Web服务器。

然后,我们使用OOTB报表查看器来显示报表,但它是在框架中托管的,以便屏幕的顶部允许用户被包含到自定义web应用程序中。这使他们能够快速返回并更改参数。

我们采取了这种方法,因为我们拥有一个全球性组织,但我们的应用程序是集中托管的 - 我们希望所有用户的表现尽可能好。我们发现报表查看器在性能方面非常出色,但OOTB的OOTB参数选择对于高延迟连接非常糟糕 - 大量回传和传输的流量过多。

另一个诀窍 - 我们在报告中使参数“隐藏”,以便参数不显示在报告查看器中。

编辑:我们在此基础上做了SSRS 2005,最近升级到了SSRS 2008,最小麻烦。

+0

只是为了澄清:发布HTTP POST的表单只是针对'iframe'?有没有任何资源可以帮助你弄清楚(书籍,文档等)?我认为SSRS Web服务层是自定义应用程序生成报告的更“标准”方式,而不是HTTP POST。有趣的知道这个把戏。 – JPot 2009-09-16 00:26:01

+1

这里是关于通过URL参数访问报告的MSDN文章 - http://msdn.microsoft.com/en-us/library/ms155391.aspx 我们最终做HTTP POST的原因(同样的命令适用)是为了避免有大量选定参数的问题和1024(?)URL长度限制。 我只是再次检查,我们的表单是在另一个隐藏的框架,所以目标是它自己的框架,我们只是发布窗体时调整帧的大小。 我们使用Web服务来获取用户可用的报告列表,并使用本地报告查看器来显示报告。用户然后可以与其正常交互。 – Harv 2009-09-16 03:05:49

3

我们所做的是构建了一个UI来收集标准和格式(PDF,XLS等)数据,并使用SSRS Web Services来激发报告。

它使我们能够完全按照您在报告中使用您自己的UI &品牌的方式进行操作。

本质上,您将RDL名称和一组报告参数传递给webservice,它将返回HTML(或您指定的任何格式)。

的一些陷阱包括有:当您使用SSRS的列排序重新写网址,且如果你想支持PDF/DOC/XLS /等设置自己的MIME类型...

+0

这个UI相对静态吗?即,根据报告的参数,输入控件是“硬编码”还是动态创建的?好奇... – JPot 2009-09-15 03:48:22

+1

每个报告都有自己的一组输入控件(有些报告要求比其他标准更多的标准)。因此,我们所做的是创建了一个自定义控件,用于管理每个自定义aspx页面和SSRS之间的所有通信。这样,创建报告所需的一切就是输入的定义,输入数据的收集以及将这些数据传递到我们的自定义Reporting Services控件中。 我们的每个报告都是一个新的aspx页面,它有自己的一组输入控件。某些输入控件根据用户的访问权限和配置显示/隐藏。 – 2009-09-15 04:06:22

4

如果我没有理解如果你正确的话,你会想使用ReportViewer来渲染报告。

您可以实现输入采集,无论如何,然后简单地将输入的报告作为参数:

//the report classes are in the namespace: Microsoft.Reporting.WebForms 
Collection<ReportParameter> paramList = new Collection<ReportParameter>(); 
string reportPath = ApplicationInfo.ScorecardReportPath; 
paramList.Add(new ReportParameter("UID", "5")); 

ReportViewer1.ProcessingMode = ProcessingMode.Remote; 
ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://servername/ReportServer"); 
ReportViewer1.ServerReport.ReportPath = reportPath; 
ReportViewer1.ServerReport.SetParameters(paramList); 
ReportViewer1.ServerReport.Refresh(); 

中的ReportViewer是你可以拖放到你的页面上的控件:

<rsweb:ReportViewer id="ReportViewer1" runat="server" documentmapwidth="175px" 
font-names="Verdana" font-size="8pt" promptareacollapsed="true" width="100%" 
zoommode="Percent" zoompercent="100"/> 

我已经使用这种方法将reportviewer嵌套在母版页中包含的页面中。它允许显示菜单/页眉/页脚。