首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReportManager如何在外部使用与防火墙后面不同的端口?

ReportManager如何在外部使用与防火墙后面不同的端口?
EN

Server Fault用户
提问于 2013-06-13 15:59:45
回答 1查看 1.1K关注 0票数 2

我是在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被打破,但问题仍然存在。

EN

回答 1

Server Fault用户

回答已采纳

发布于 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时,客户端不会发送,所以始终是空的。

代码语言:javascript
复制
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);
            }
        }
    }
}
票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/515589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档