我在本机模式下处于SSRS 2012。 这个configuration似乎没有太大的改变,从我升级的SSRS 2008,所以这个问题适用于两个版本(但是,如果有解决scheme,它可能会或可能不适用于这两个)。
我处于这种情况,我想从防火墙外部的一组端口上configurationReportManager网站,但是在内部,在另一个端口上安装了SSRS。 有谁知道这可以做到吗?
这是一个问题的原因是因为SSRS代码坚持构build完整的,绝对的URL到ReportManager网站的不同位置。 (国际海事组织,这只是SSRS许多重大/瘫痪的devise缺陷之一)如果它只是使用不指定域+端口的URL,这不会是一个问题。
我们从“ http://reports.example.com/ssrs ”的外部URL开始,并将ReportManagerconfiguration为使用端口8080(当然,您的端口从80端口转到8088端口)。 如果您转到外部url,那么您会很好地访问该网站; 让我们忽略AuthC子系统并假设你login成功。 对于某些链接(例如“详细信息视图”,“移动”,“删除”等),现在,您不会去预期的位置,因为SSRS会尝试将您发送到“ http://reports.example”。 com:8080 / ssrs / …“。 您可以通过删除端口手动修复链接,然后进入页面。 SSRS 2012和SSRS 2008之间的URL存在差异,但问题仍然存在。
我有一些工作在SSRS 2012,但它是一个彻头彻尾的黑客。 可以使用客户端JavaScript来重写所有的URL(加上偶尔的RedirectUrl参数SSRS喜欢的),但是这并不能解决Response.Redirect()调用服务器端的问题。 所以你会留下一个部分的解决scheme。
简而言之,将一个HttpModule添加到ReportManager,以便您可以添加一个PreRequestHandlerExecute事件处理程序。 在里面,使用reflection来修复GlobalApp.BaseUrl和Request.Url去掉HOST头,而不是默认的。 你必须改变两者,因为SSRS在构build链接时并不总是使用自己的BaseUrl。 (我使用ILSpy来查找要更改的字段。)
这是我的。 我相信它可以做得更好,但是我有工作,我不再关心了。 在SSRS上工作有一种方法可以吸引你的意愿。
编辑 :修复修改Request.Url的部分。 请注意,虽然它指定.Fragment,客户端不发送,所以它总是空白。
void context_PreRequestHandlerExecute(object sender, EventArgs ea) { HttpApplication app = sender as HttpApplication; // also at: HttpContext.Current.ApplicationInstance string host = app.Context.Request.Headers["HOST"]; if (!string.IsNullOrEmpty(host)) { System.Reflection.FieldInfo fi = typeof(Microsoft.ReportingServices.UI.GlobalApp).GetField("m_baseUrl", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (fi != null) { string protocol = "http://"; if (app.Context.Request.IsSecureConnection) protocol = "https://"; Uri url = new Uri(string.Format("{0}{1}{2}", protocol, host, app.Context.Request.ApplicationPath)); fi.SetValue(app as Microsoft.ReportingServices.UI.GlobalApp, url); fi = typeof(System.Web.HttpRequest).GetField("_url", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (fi != null) { url = new Uri(string.Format("{0}{1}{2}{3}{4}", protocol, host, app.Context.Request.FilePath, app.Context.Request.Url.Query, app.Context.Request.Url.Fragment)); fi.SetValue(app.Context.Request, url); } } } }