【问题标题】:SSRS Report Viewer - ASP.Net Session Expired or not found on NLB (SQL Server)SSRS 报告查看器 - ASP.Net 会话已过期或在 NLB(SQL Server)上找不到
【发布时间】:2018-03-31 10:36:18
【问题描述】:

嗨,

我在NLB production environment 上遇到了一个问题,其中配置了两个应用程序服务器。两者都有一个ReportViewer 的虚拟目录,它使用.aspx 页面在iframe 中呈现SSRS reports

“ASP.NET 会话已过期或找不到”错误后,我用自定义数据库更改了sessionState mode=SQLServer,但错误仍然存​​在。我也可以在数据库表中看到会话条目。

还可能缺少什么?

-我在某处读到过在域名中有_ (underscore) 会导致这种情况。我检查了网址,querystring 参数中有一个下划线但没有域名本身,并且查询字符串是由ReporViewer ScriptResource.axd 本身自动生成的。

-KeepSessionAlive 也是如此,AsyncRendering 也是如此,在这两种状态下都检查了这些,问题没有得到解决。

-cookieless 设置为“假”

-ReportViewer 版本如下:

<add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=xx" />
<add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=xx" />

任何能帮助我指出正确方向的帮助将不胜感激。 谢谢 :)

【问题讨论】:

  • 域名中有一个破折号'-',这会是问题的原因吗?
  • 是您的客户端应用程序或 ssrs 页面中的会话超时,还是两者兼而有之?
  • Reportviewer 控件的 Scriptresource.axd 进行 xhr 调用并得到会话超时错误作为响应。客户端应用程序本身没有会话管理,它只是一个带有 reportviewr 控件的 aspx 页面,该客户端应用程序的 webconfig 包含我认为默认情况下用于 ssrs 会话的 sessionState mode=SqlServer 标签,如果我错了,请纠正我。
  • 第一次打开reportviewer时,通过两个节点的localhost检查,在aspstate db中创建了一个新的会话条目,这意味着两个节点都可以到达aspstate DB,然后随机会话没有发生发现或过期错误,这可能是在第 3-4 次点击或在第 20-25 次点击之后,没有设置模式。
  • 报表服务器有全局响应超时,每个报表在ssrs中都有超时设置。但是,如果我记得那些返回为“报告处理超时”而不是“会话超时”。我会坚持你的假设。这是我试图解释的链接。 stackoverflow.com/questions/21011759/…

标签: reporting-services ssrs-2008 reportviewer nlb sql-session-state


【解决方案1】:

在使用 SSRS 的 NLB 场景中,您需要考虑的主要问题是 ViewState。如果用户访问负载平衡 URL,他们的流量可能会流向负载平衡器池中的任何 SSRS 服务器。您需要在所有 SSRS 服务器上设置相同的机器密钥,以允许任何服务器获取它们的会话。

我在下面的 SQLShack 帖子中写了所有必需的步骤。只要 SSRS 是这样设置的,前端就不会知道/关心你给它一个(负载平衡的)URL 来命中的事实。希望对您有所帮助!

https://www.sqlshack.com/scaling-out-reporting-services-changes-in-sql-server-2016/

【讨论】:

  • 好吧,通过 NLB,我指的是应用程序服务器 (IIS) NLB,而不是 NLB 上的 SSRS 报告服务器。我现在还不确定,因为我目前没有生产服务器访问权限。但是我也会检查一下,只是一个简单的问题,我是否必须将 IIS 应用程序的 web.config 中使用的相同机器密钥也放入报告管理器的 web.config 中。此外,对于 sessionState,我已经为 2 个应用程序而不是 2 个不同节点上的报表管理器实现了 SqlServer 模式,我是否也必须使用 sqlServer 配置它们。感谢您提供有用的链接。
  • @zeppelin,嗯,情况略有不同。对于机器密钥,我认为您可以将相同的机器密钥添加到所有服务器上的 .NET 文件夹中,并为该服务器上的所有基于 IIS 的应用程序提供服务。我相信它在这里你改变它: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG 对于 SSRS 报告管理器,您需要横向扩展部署中的所有节点,共享同一个数据库。您将希望他们使用 IIS 负载平衡或 NLB 共享单个 URL。不过,他们可以使用自己的 URL(即server1/reportsserver2/reports)。一切都取决于它的设置方式:)
  • 我检查了两个应用程序服务器 (IIS) 和两个报表服务器 - 两个层都在 NLB 上 - 一切似乎都很好。两个 IIS 服务器和两个报表服务器都有同步的机器密钥。 IIS 服务器的 SessionState = SQLServer,而 ReportServer 的 SessionState = InProc。此外,错误显示“找不到 Asp.Net 会话或已过期”,并且我认为 ReportServer 不使用 Asp.Net 会话管理,这让我相信错误来自我的 .aspx 页面,其中包含 .净报表查看器控件。你说什么?我还应该检查什么?任何想法。
  • 很难想象你的环境。我想如果你把它全部剥离回SSRS。只要以特定方式设置,任何解决 SSRS 的 NLB url 的东西都应该没问题。所以...如果 SSRS 有一个像 Reporting.company.com 这样的 URL。然后在 NLB 池中,您有 Server1 和 Server2,您在 SSRS 中的设置应如下所示: - ReportServer web.config: - rsReportServer.config: Reporting.company.comReporting.company.com/reportserver</UrlRoot> - 横向扩展部署应该包括两台服务器。 ...
  • 您的 web.config 文件或两个 SSRS 服务器中的 Machine.config 文件应包含相同的手动 machinekey 或自动生成的选项。如果您已完成所有设置,请尝试直接从Reporting.company.com URL 访问 SSRS。浏览几份报告。这一切都有效吗。您需要使用它 10 分钟或更长时间,希望能推动您跨两台服务器(检查您的 ExecutionLog3 表。)您是否看到两台服务器都呈现报告。如果是这样,您的 SSRS 设置就是黄金。问题在于您的应用程序服务器。到目前为止我能提供的最好的我害怕:) 希望有帮助
猜你喜欢
  • 2012-10-12
  • 2012-03-18
  • 1970-01-01
  • 2013-12-03
  • 2014-01-27
  • 2011-04-23
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多