我在本机模式下使用 SSRS 2012。配置与我升级的 SSRS 2008 相比似乎没有太大变化,因此该问题适用于两个版本(但是,如果有解决方案,它可能适用于也可能不适用于这两个版本)。
我处于一种情况,我想从防火墙外部的一组端口提供 ReportManager 网站,但在内部,在不同的端口上设置 SSRS。有谁知道这是如何实现的?
细节
这是一个问题的原因是因为 SSRS 代码坚持构建完整的绝对 URL 到 ReportManager 网站中的不同位置。(IMO,这只是 SSRS 中许多重大/严重的设计缺陷之一)如果它只是使用未尝试指定域+端口的 URL,这将不是问题。
例子
让我们从外部 URL“ http://reports.example.com/ssrs ”开始,ReportManager 被配置为在端口 8080 上运行(当然,您的端口转发从端口 80 转到 8088)。如果你转到外部 URL,你会很好地访问该站点;让我们忽略 AuthC 子系统并假设您登录正常。对于某些链接(例如“详细信息视图”、“移动”、“删除”等),现在,您不会到达预期的位置,因为 SSRS 试图将您发送到“ http://reports.example。 com:8080/ssrs/ ...”。您可以通过删除端口手动修复链接,然后您将到达该页面。SSRS 2012 和 SSRS 2008 之间损坏的 URL 有所不同,但问题仍然存在。
我有一些可以在 SSRS 2012 上运行的东西,但它完全是 hack。可以使用客户端 Javascript 重写所有 URL(加上 SSRS 喜欢的偶尔的 RedirectUrl 参数),但这不考虑服务器端的 Response.Redirect() 调用。所以你会得到一个部分解决方案。
简而言之,将 HttpModule 添加到 ReportManager,以便您可以添加 PreRequestHandlerExecute 事件处理程序。在其中,使用 Reflection 修复 GlobalApp.BaseUrl 和 Request.Url 以关闭 HOST 标头而不是默认标头。您必须更改两者,因为 SSRS 在构建链接时并不总是使用自己的 BaseUrl。(我使用 ILSpy 查找要更改的字段。)
这是我的。我敢肯定它可以做得更好,但我已经工作了,我不再关心了。在 SSRS 上工作会吸取你的生存意愿。
编辑:修复了修改 Request.Url 的部分。请注意,虽然它指定了 .Fragment,但客户端不会发送它,因此它始终为空白。