好的,问题解决了。有点儿。该问题不仅限于嵌入式图像,而且因为我没有使用 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 必须使用会话信息来返回像显示在所有报告上的徽标这样简单的东西,这超出了我的理解……花了很长时间才弄清楚这一点,而且解决方案并不是特别漂亮…… .