【问题标题】:SSRS -External image not rendering on HTML reportSSRS - 外部图像未在 HTML 报告上呈现
【发布时间】:2017-11-01 13:45:41
【问题描述】:

我正在编写 SSRS 报告。我有一个嵌入了外部图像的报告 这在报表查看器中呈现良好。

但是当我通过 web url 在我的应用程序中呈现 HTML 4.0 格式的报告时(不使用报告查看器)。从除图像之外的所有数据返回的报告不在 html 中

看到图像标签如下所示:-

<img onerror="this.errored=true;" class="r1" src="http://ges-server-pc/ReportServer_SQLEXPRESS?%2FGES-MVC%2FGES_FWCR&amp;rs%3ASessionID=vdpuofii3xtph545xelnym45&amp;rs%3AFormat=HTML4.0&amp;rs%3AImageID=1403af250c474da8a5f851b63a8a377b">

如何在格式= HTML 4.0 的报告上呈现外部图像

任何人都可以有相同的解决方案吗?这将是可观的

提前致谢

【问题讨论】:

  • 我敢打赌这是一个权限问题。您无权访问该资源。它看起来像来自渲染流的图像。您如何通过报表服务器进行身份验证?
  • 是的,我在控制台中收到错误,状态代码为 401(未授权)。我正在使用“CredentialCache.DefaultCredentials”验证我的报告
  • 你能解释一下你是如何获得有效载荷的吗?听起来您正在使用带有凭据的 ssrs 进行身份验证,然后报告以 byte[] 的形式返回并显示报告。有效负载内部是对返回报表服务器的 url 的引用,但是,您的渲染授权不包括您的应用程序需要访问它在服务器上创建的图像。
  • 我正在使用服务器凭据对 SSRS 进行身份验证以呈现报告,然后报告作为响应流中的 HTML 返回并在我的应用程序中填充它而不使用报告查看器。看来我服务器渲染的html中的图像没有获得许可
  • 如果没有 ssrs 将报告图像流式传输到/来自您的用户可以访问的位置,或者没有授予应用程序对 rs 本身的访问权限,我不知道答案。如果您找到一种通过 url 发送 DeviceInfo.StreamRoot 值的方法,那么您可以通过 URL 访问来执行此操作。我将发布一个我用来解决这个问题的答案。看看它,如果它不是你愿意承担的,或者你找到了 url 访问的解决方案,那么我将删除我的答案。请注意,我是直接使用 ssrs api 而不是 url 访问。

标签: reporting-services sql-server-2012 ssrs-2012


【解决方案1】:

这是确保您的应用程序能够可靠地显示由 SSRS 在报告中动态呈现的图像的一种方法。

当您使用报表查看器控件时,需要在幕后完成很多工作以保持活动会话并允许访问由用户请求的报表生成的所有工件。当您直接使用 ReportExecution api 时,有一些高级报告功能不受支持。交互式排序、大小调整、向下钻取和此问题仅举几例。

始终确保您的客户可以使用报告中的动态图像非常容易。我不得不越过这个障碍,我会分享我解决它的方法。

简而言之,您将不得不拦截渲染,迭代流,并将每个资源保存到临时文件夹并告诉 ssrs 在您的临时文件夹中查找图像,该文件夹位于您结束的 Web 应用程序后面用户已通过身份验证。

设备信息

大部分被忽视的设备信息结构将派上用场。在此结构中,您将找到 StreamRoot 属性。你可以找到这方面的文件。它基本上允许您覆盖 SSRS 将根据需要流式传输资源的位置。这就是您告诉 SSRS 在新位置查找外部图像的方式。

对于每个呈现的报告,我在呈现之前使用 guid 创建一个临时文件夹。此外,在渲染之前,您需要将 StreamRoot 设置为此临时文件夹。

string physicalTempFolder = MakeNewTempFolderInTempOffOfWebRoot();
string virtualTempFolder = Path.Combine(yourWebRoot,"Temp",Path.GetDirectoryName(physicalTempFolder));

现在您有一个指向您的存储库的物理和虚拟指针,其中将为您的报告保存图像。现在更新 SSRS 中的 StreamRoot。这告诉 SSRS 我们要覆盖动态图像的默认位置等等。

StringBuilder devInfo = new StringBuilder();
if (YourRenderFormat=="HTML")
{
    devInfo.Append("<DeviceInfo>");
    devInfo.Append("<StreamRoot>" + virtualTempFolder+ "</StreamRoot>");  
    devInfo.Append("</DeviceInfo>");       
}

通过构建所需的设备信息结构,我们可以将其传递给渲染方法。

string extension;
string mimeType;
string reportEncoding;
string[] streamIDs = null;
ReportExecution2005.Warning[] warnings = null;            

ReportExecution2005.ExecutionHeader execHeader = new ReportExecution2005.ExecutionHeader();
ReportExecution2005.ExecutionInfo rpt = _execService.LoadReport(YourReportPath, null);

if(YourParamas!=null)
    _execService.SetExecutionParameters(YourParams, "en-us");
_execService.ExecutionHeaderValue = execHeader;
_execService.ExecutionHeaderValue.ExecutionID = rpt.ExecutionID;

result = _execService.Render(format, devInfo.ToString(), out extension, out mimeType, out reportEncoding, out warnings, out streamIDs);

render方法返回streamIDs out参数,这里是关键。接下来在我们调用render之后,简单地迭代所有的图像流并调用ssrs的RenderStream()方法来获取图像并保存到你的物理临时文件夹中。

if (YourRenderFormat=="HTML"))
{

    string imageEncoding = "";               
    // For each image stream returned by the call to render,
    // render the stream and save it to the application root
    string FilePath = physicalTempFolder;
    byte[] image;
    // For each image stream returned by the call to render,
    // render the stream and save it to the application root
    foreach (string streamID in streamIDs)
    {
        image = _execService.RenderStream("HTML4.0", streamID, null, out imageEncoding, out mimeType);
        //All files are unique
        File.WriteAllBytes(Path.Combine(physicalTempFolder,streamID),image);
    }
}
return result;

【讨论】:

  • 嗨@Rosh Bush,不,我改变了我的逻辑,我正在使用像 ReportexecutionService 类(渲染方法)这样的 Web 服务访问我的报告 Html 用我的文件夹路径替换了这样的图像 ges-server-pc/…\GraphFiles\8c6c13be-46c7-4db5-9352-14.jpg/> 但仍然图像未显示在渲染 html 报告中
  • 如果您可以验证图像是否正在写入您的 Web 应用程序下的临时文件夹,那么与管理您的应用程序的应用程序池关联的帐户肯定具有读取权限。您可以创建一个测试网页并添加一个 。您是否将完全限定的域名分配给 StreamRoot?
  • 感谢您的支持...我是 SSRS 的新手...这里我发布了与此问题相关的另一个问题。这里我用代码 stackoverflow.com/questions/47219831/… 简要描述了我的问题
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2013-06-24
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多