4

我在所有报告的顶部都有一个徽标作为嵌入图像。

这些报告通过 SSRS Web 服务接口显示在 ASP.Net Web 应用程序中——所有这些都是非常标准的东西,但图像没有呈现——我只是得到一个损坏的链接。

这个问题有很多可能的解决方案,我尝试了一些方法,包括在 ConfigurationInfo 表中将 UseSessionCookies 设置为 false。

我注意到的是,当我将使用 Web 应用程序的匿名帐户从最低权限的服务帐户更改为我自己的用户帐户时,图像显示正常。

我不明白为什么会这样,也无法弄清楚我的 Web 应用程序的服务帐户需要哪些特殊权限才能查看报告中的嵌入图像。

任何人都可以帮忙吗?

4

2 回答 2

7

好的,问题解决了。有点儿。该问题不仅限于嵌入式图像,而且因为我没有使用 Reporting Services 查看器而发生。

总结一下:

1) 当您的 Web 应用程序调用报表服务器时,它完全有权这样做。生成的 SessionID 仅对 Web 应用程序帐户(即应用程序运行的服务帐户)可用。

2) Web 应用程序将 RAW HTML4.0 输出到屏幕。

3) 浏览器接收 HTML 并尝试检索 HTML 中引用的图像。

4) 浏览器以您的用户帐户运行(例如 domain\username1)

5) 报表服务器收到如下请求:

6) 现在 URL 中列出的 SessionID 与 domain\username1 没有关联,因此报表服务器声称它不存在。

当您将应用程序域设置为使用 domain\username1 帐户时,SessionID 恰好与您的帐户相关联,因此突然之间“工作”了。但是,当真正的用户尝试系统时,他们抱怨图像丢失,因为他们的域\用户名 N 与应用程序池帐户不匹配。

此问题的解决方案如下:

1) 使用报表查看器控件。这将确保浏览器接收到的 URL 将指向您的 Web 应用程序,并且您的 Web 应用程序标识将用于从报表服务器检索它们。

2) 在您的 Web 应用程序代码中,解析您从 Render 调用返回的 HTML4.0,获取并缓存所有图像,重新编写 HTML4.0 链接以指向您的 Web 应用程序存储的缓存图像,然后将其发送到浏览器(如果这看起来很复杂......然后使用 Report Viewer 控件,因为它使场景工作)

3) 您可以尝试使用 MHTML 输出格式,这将生成一个完全合格的报告,其中包含嵌入在二进制流中的图像。这样做的结果是更难将其嵌入到应用程序页面中......但并非无法克服

我选择使用 2) 的变体,因为我不想使用报表查看器。我尝试显示的徽标已托管在调用 Web 应用程序中,因此我只需将 SSRS 报告执行服务返回的响应中的 img 标记的 src 属性替换为该位置的 url。

我真的不想按照建议使用报告查看器作为解决此问题的最佳方法。为什么 SSRS 必须使用会话信息来返回像显示在所有报告上的徽标这样简单的东西,这超出了我的理解……花了很长时间才弄清楚这一点,而且解决方案并不是特别漂亮…… .

于 2013-04-10T15:20:17.843 回答
3

这是外部图像吗?看看这篇MSDN 文章,它解释了检索图像所需的权限:

在报表设计器中预览报表时,预览使用用户的凭据来显示图像。当报表在报表服务器上运行时,报表服务器使用无人参与的执行帐户来检索图像。如果未指定无人值守执行帐户,则不使用凭据(匿名用户帐户)检索图像。如果这些帐户中的任何一个没有足够的权限访问该图像,则该图像将不会显示在报告中。

我会在报告管理器中检查图像的权限。

于 2013-03-19T14:35:13.147 回答