我正在尝试在 Silverlight 5 应用程序中实现 SSRS 报告功能,该应用程序在浏览器模式下运行。
尝试 1) 最初的计划是在 Silverlight 客户端上使用 URL 技术呈现页面
var path = item.Path; // Where item.Path is something like '/MyReportFolder/Report1'
var url= @"http://<MyServerAddress>/ReportServer/Pages/ReportViewer.aspx?{0}&rs:Command=Render";
var completeUrl = string.Format(url, path.Replace(@"/", "%2f").Replace(" ", "+"));
System.Windows.Browser.HtmlPage.Window.Navigate(new Uri(completeUrl), "_newWindow", "toolbar=0,menubar=0,resizeable=1,scrollbars=1");
这里的问题是调用此 URL 的权限将难以管理,并且与 Silverlight 应用程序运行的基本安全性无关。
尝试 2) 通过 WebClient 中的类似 Url 调用在 IIS 服务器上(而不是在客户端,代表用户通过 WCF 调用)呈现报告并下载 byte[] 输出,然后发送 byte[ ] 到 Silverlight 客户端(作为对 WCF 调用的响应),然后在 Silverlight 应用程序中呈现内容。
var path = itemPath;
var url = @"http://<MyServerAddress>/ReportServer/Pages/ReportViewer.aspx?{0}&rs:Command=Render";
var completeUrl = string.Format(url, path.Replace(@"/", "%2f").Replace(" ", "+"));
var tcs = new TaskCompletionSource<byte[]>();
var webClient = new WebClient();
webClient.DownloadDataCompleted += (sender, args) => tcs.TrySetResult(args.Error != null ? args.Result : new byte[0]);
webClient.DownloadDataAsync( new Uri(completeUrl));
return tcs.Task;
也可以将报告呈现为 byte[],并且可以通过 WCF 服务操作调用轻松处理安全性。但是,一旦客户端收到 byte[],我不知道如何在屏幕上显示结果。我的偏好是打开一个新的浏览器窗口并将内容呈现到其中,但是 System.Windows.Browser.HtmlPage.Window 不支持这一点。
所以我的选择是:
- 将 IIS 服务器上的结果呈现到一个临时文件并将 URL(而不是 byte[])发送到 Silverlight 客户端,以便浏览器客户端可以打开结果。这是一个糟糕的结果,因为结果与尝试 1非常相似,因为 URL 可供第三方接收者使用
- 将报告呈现为 TIFF 字节 [],但是我不确定这将处理多页报告,并且它可能不支持 PDF 和 XLS 报告内容,因为 TIFF 需要显示在 Silverlight 图像控件中,而不是浏览器。
- 我还没有考虑过其他一些很棒的选择......
是否有其他人尝试在 Silverlight 应用程序中使用企业 SSRS 功能并找到类似问题的解决方案?