我是在SSRS 2012在本机模式。与我升级的SSRS 2008相比,配置似乎没有太大变化,所以这个问题适用于这两个版本(但是,如果有解决方案,它可能适用于也可能不适用于这两个版本)。
在这种情况下,我想从防火墙外部的一组端口上为ReportManager网站提供服务,但在内部,在另一个端口上设置了SSRS。有谁知道如何做到这一点吗?
这是一个问题,因为SSRS代码坚持要为ReportManager网站中的不同位置构建完整、绝对的URL。(IMO,这只是SSRS中许多重要的/严重的设计缺陷之一)如果它只使用没有试图指定domain+port的URL,这将不是一个问题。
让我们从"http://reports.example.com/ssrs“的外部URL开始,ReportManager被配置为活在端口8080上(当然,您的端口转发从端口80转到8088 )。如果您转到外部URL,就可以很好地访问站点;让我们忽略AuthC子系统,假设您登录了OK。对于某些链接(例如,“详细信息查看”、“移动”、“删除”等),现在,您不会去您预期的地方,因为SSRS试图将您发送到“http://reports.example.com:8080/ssrs/.”。您可以通过移除端口来手动修复链接,然后就可以到达页面。在SSRS 2012和SSRS 2008之间有不同的URL被打破,但问题仍然存在。
发布于 2013-06-15 01:18:03
我有一些在2012年SSRS上有效的东西,但这完全是一次黑客攻击。可以使用客户端Javascript重写所有URL(外加偶尔喜欢的RedirectUrl参数SSRS ),但这并不能解释服务器端的Response.Redirect()调用。所以你会有一个局部的解决方案。
简而言之,向HttpModule添加一个ReportManager以便您可以添加一个PreRequestHandlerExecute事件处理程序。在其中,使用反射修复GlobalApp.BaseUrl和Request.Url,以关闭主机头,而不是默认。您必须同时更改这两者,因为SSRS在构建链接时并不总是使用自己的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);
}
}
}
}https://serverfault.com/questions/515589
复制相似问题