通过WebClient byte []或替代方案安全地在Silverlight应用程序中呈现SSRS报告

时间:2013-04-10 23:19:42

标签: silverlight reporting-services webclient

我正在尝试在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不支持此功能。

所以我的选择是:

  1. 将IIS服务器上的结果呈现为临时文件,并将URL(而不是byte [])发送到Silverlight客户端,以便浏览器客户端可以打开结果。这是一个糟糕的结果,因为结果与 Attempt 1 非常相似,因为Url随后可用于第三方接收器
  2. 将报告呈现为TIFF字节[],但我不确定这会处理多页报告,并且它可能不支持PDF和XLS报告内容,因为TIFF需要在Silverlight图像控件中显示,而不是浏览器。
  3. 其他一些很棒的选择我还没有考虑......
  4. 有没有其他人尝试在Silverlight应用程序中使用企业SSRS功能并找到类似问题的解决方案?

1 个答案:

答案 0 :(得分:0)

有一个组件 - PerpetuumSoft Viewers For SSRS(这是我需要承认的组件),它使用基于XAML的本机查看器在Silverlight应用程序中无缝集成SSRS报告。所以我们显然找到了解决方案。