在没有报告查看器的情况下将 s-s-rS 报告嵌入网页

Posted

技术标签:

【中文标题】在没有报告查看器的情况下将 s-s-rS 报告嵌入网页【英文标题】:Embed s-s-rS report into web page without Report Viewer 【发布时间】:2013-11-26 13:23:52 【问题描述】:

我有一个用 VS2008 和 C# 编写的现有 Web 应用程序,我需要在其中将 s-s-rS 报告嵌入到网页中。数据库/s-s-rS 服务器位于异地并位于防火墙后面,只能通过单独的 Web 服务器框的 IP 访问。数据库框正在运行 SQL Server 2008R2。 我无法使用报表查看器控件作为解决方案。

我已经尝试了 s-s-rS 网络服务和 URL 访问。调用 LoadReport 和/或 Render 方法时,使用 Web 服务会引发错误。使用 URL 访问会为报告项的路径生成错误。我尝试了许多不同的代码示例和方法来解决这个问题,但没有成功。有没有人有我可以用来让它工作的工作代码示例?

理想情况下,我希望通过某种方式从调用中返回 html,然后我可以将其放入 DIV 标记或 iframe 中。

【问题讨论】:

您是如何尝试使用 Web 服务的?抛出了哪些错误? 我添加了对xxx.xxx.xxx.xxx/Reportserver/ReportExecution2005.asmx 的 Web 引用然后如果我设置凭据然后调用 LoadReport("/My+Reports/the-reportname", historyID) 返回错误:项目的路径'/My+Reports/the-reportname' 无效。完整路径的长度必须少于 260 个字符;其他限制适用。如果报表服务器处于本机模式,则路径必须以斜杠开头。 ---> 如果我将路径切回“/My+Reports”,我已经能够成功加载我的报告列表,将任何报告名称添加到它生成该错误的路径中。 您是否尝试过直接访问报告而不是“我的报告”?我的报告是特定于用户的,可能会提供线索。 ExecutionInfo ei = re.LoadReport("the-reportname", historyID);这将返回相同的错误。 报告名称前缺少前导 /。 ExecutionInfo ei = re.LoadReport("/the-reportname", historyID);返回错误:找不到项目'/the-reportname'。 ---> 【参考方案1】:

这是一个对我有用的示例

网络配置 ...

<!-- Reporting -->
        <add key="ReportingUserName" value="xxxxx\xxxx" />
        <add key="ReportingPassword" value="xxxxxxxxx" />
        <add key="ReportingDomain" value="xxxxxxx" />


     <endpoint address="http://xxxxxx/ReportServer/ReportExecution2005.asmx" binding="basicHttpBinding" bindingConfiguration="basicHttpBindingConfig" contract="s-s-rS.ReportExecutionServiceSoap" name="ReportExecutionServiceSoap" />

     <!-- Binding for Reporting Services over HTTP -->
            <binding name="basicHttpBindingConfig" allowCookies="true" maxReceivedMessageSize="52428800" sendTimeout="00:10:00">
              <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
              </security>
            </binding>

outputType ReportFormat 即 Pdf,Image,Excel,Ffd

deviceInfo 包含用于报告服务的 XML 字符串,基于 报告格式

reportPath 包含 s-s-rS 服务器“/xxx/datarecord-Table”上的报告路径

  private SsrsResponse ExecuteSsrsReport(string reportPath, IEnumerable<KeyValuePair<string, string>> parameters,
        string outputType, string deviceInfo)
    
        using (var rs = new ReportExecutionServiceSoapClient())
        
            if (rs.ClientCredentials != null)
            
                rs.ClientCredentials.Windows.ClientCredential = GetReportingCredentials();
                rs.ClientCredentials.Windows.AllowedImpersonationLevel =
                    System.Security.Principal.TokenImpersonationLevel.Impersonation;
            

            byte[] result;
            Warning[] warnings;
            string[] streamIds;

            ParameterValue[] parameterValues =
                parameters.Select(p => new ParameterValue  Name = p.Key, Value = p.Value ).ToArray();

            ExecutionInfo execInfo;
            ServerInfoHeader serverInfoHeader;

            ExecutionHeader execHeader =
                rs.LoadReport(null, reportPath, null, out serverInfoHeader, out execInfo);
            rs.SetExecutionParameters(execHeader, null, parameterValues, "en-us", out execInfo);

            string extension, mimeType, encoding;
            rs.Render(execHeader, null, outputType, deviceInfo,
                out result, out extension, out mimeType, out encoding, out warnings, out streamIds);

            return new SsrsResponse(result, extension, mimeType, encoding);
        
    

private NetworkCredential GetReportingCredentials()

    return new NetworkCredential(
        ConfigurationManager.AppSettings["ReportingUserName"],
        ConfigurationManager.AppSettings["ReportingPassword"],
        ConfigurationManager.AppSettings["ReportingDomain"]
    );

【讨论】:

在“使用”行中,IDE 将 ReportExecutionServiceSoapClient 突出显示为未找到类型或命名空间。与返回行中的 SsrsResponse 相同。不知道为什么。 我修复了 ReportExecutionServiceSoapClient,我使用的是 Web 引用而不是服务引用。仍然无法弄清楚返回行中的“SsrsResponse”有什么问题。有人吗??【参考方案2】:

尝试在 iframe 中调用相同的报表 URI。

【讨论】:

我很确定如果跨不同域访问 iFrame 将无法工作——Web 服务跨域问题。但是,如果这对可以运行的项目来说不是问题。

以上是关于在没有报告查看器的情况下将 s-s-rS 报告嵌入网页的主要内容,如果未能解决你的问题,请参考以下文章

跟踪报告使用情况

s-s-rS 以多文化语言报告

s-s-rS 报告查看器 + ASP.NET 凭据 401 异常

如何在 Webpart 的 s-s-rS 报告中打开 URL 到新窗口

在 ASP.net MVC 站点中查看 s-s-rS 报告

s-s-rS 2008 R2 如何在打开报告时摆脱对话框