2

我对 ReportViewer 控件使用 SessionState 的方式有疑问。

背景:我们有一个 .NET 3.5 WebForms 应用程序,它在 RemoteServer 模式下使用 ReportViewerControl

由于我们的应用程序使用需要 SessionState 的框架(使用 SQL Persistence),因此 ReportViewer 控件似乎也与 SessionState 挂钩。

RV 对会话状态的使用是有问题的:

  1. 它立即需要额外的 9k 序列化(在 dbo.ASPStateTempSessions 中)
  2. 显示报告后,所有其他页面都会反序列化 RV 会话状态(即每个页面,即使它没有报告查看器控件)这包括用于连接到 SSRS 服务器的凭据的序列化。

在稍后的某个时间点,一旦 SSRS 清理了其一侧的执行,这不可避免地会导致 rsExecutionNotFound 异常(报告执行 xyz 已过期或找不到)

其他人是如何解决 RV 这种相当粗鲁的 SessionState 行为的?

当前的想法是完全阻止 RV 使用 SessionState,例如通过为 RV 创建单独的 ASP 应用程序,然后将 RV 控件 IFrame 到我们的应用程序中。

或者,有没有办法捕获 SessionState 反序列化问题并删除 RV 的密钥?

任何建议都非常感谢!

编辑:

如果 SessionState 与 IIS 保持在 Process 中,则可能不会遇到 SessionState 反序列化问题。

使用 Fiddler,在 SessionState 反序列化期间,会观察到几个到 SSRS 的连接,即使页面没有 RV 控制(可能是序列化 RV 实体和凭据上的“设置器”实际上重新连接到 SSRS)

但是,在屏幕上从 SessionState 中删除 RV 键会阻止 Ajax RV 控制功能(例如分页)工作(即,我们不能只从 RV 收集 ExecutionIds 并在使用它们时删除它们)。

唯一的解决方案 ATM 是实施“黑客”,即在没有 RV 控制的页面上从 SessionState 中删除 RV 密钥(希望如果用户离开报告页面,我们可以在 SSRS 之前清理超时),并在 global.asax Application_Error 中捕获 AspNetSessionExpiredException 和 ReportServerException,放弃并清除会话,并将用户重定向到登录(如果用户保持 RV 屏幕打开并超时)。不幸的是,直接从 dbo.ASPStateTempSessions 中删除数据会杀死我们自己的 SessionState(注意一旦 SSRS 使会话过期或删除了 SessionState 无法再反序列化的执行)

在 RV2008 和 RV2010(使用 SSRS 2008R2)中都观察到了这种行为

4

0 回答 0