好的,问题解决了。但是有点棘手。该问题不仅限于嵌入的图像,并且由于我未使用报告服务查看器而发生。总结如下:
1)当您的 Web 应用程序调用报告服务器时,它是完全授权的。会生成一个 SessionID,仅对 Web 应用程序帐户可用(即应用程序运行的服务帐户)。
2)Web 应用程序将原始 HTML4.0 输出到屏幕上。
3)浏览器接收到 HTML 并尝试检索 HTML 中引用的图像。
4)浏览器正在以用户帐户(例如 domain\username1)的身份运行。
5)报告服务器收到的请求如下所示:
6)现在 URL 中列出的 SessionID 与 domain\username1 不相关,因此报告服务器声称不存在。
解决此问题的方法如下:
1)使用报表查看器控件。这将确保浏览器收到的 URL 将指向您的 Web 应用程序,您的 Web 应用程序标识将用于从报告服务器检索它们。
2)在您的 Web 应用程序代码中,解析从 Render 调用返回的 HTML4.0,获取并缓存所有图像,重新编写 HTML4.0 链接以指向 Web 应用程序存储的缓存图像,然后将其发送到浏览器(如果此似乎很复杂……那么请使用报表查看器控件,因为它使场景工作)
3)您可以尝试使用 MHTML 输出格式,这将生成一个完全限定的报表,并将图像嵌入二进制流中。这样做的后果是更难将其嵌入应用程序页面……但不是不可克服的。
我选择使用了第二种方法的变体,因为我不想使用报表查看器。我要显示的徽标已经托管在调用 Web 应用程序中,因此我只需用来自该位置的 URL 替换从 SSRS 报告执行服务返回的响应中 img 标记的 src 属性即可。
我真的不想像建议的那样使用报表查看器作为解决此问题的最佳方案。为什么 SSRS 要使用会话信息返回如此简单的在所有报表上显示的徽标,这超出了我的理解范围...找到问题的根本原因花了很长时间,而且解决方案并不特别美观...