在没有报告查看器的情况下将 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 报告查看器 + ASP.NET 凭据 401 异常