在Reporting Services 2008中存储和检索会话变量

时间:2009-02-20 13:13:38

标签: sql-server vb.net reporting-services ssrs-2008

是否有办法在登录期间设置会话变量,然后可用于报告?

我们有一个报告服务服务器,我们从交易系统中移动和反规范化数据以进行报告。为了允许我们的用户使用相同的用户名和密码从事务系统登录,我们已经设置了自定义表单身份验证,经过多次试验和错误后,它终于正常工作。此外,我们还拥有访问我们的交易系统的授权,因此用户权限的任何更改都会立即反映在Reporting Services中。

我们现在的问题是我们想添加一些额外的功能,例如根据事务系统中的用户权限/组锁定参数。我们已经找到了一种方法,但效率很低,基本上我们有存储过程来查询我们的事务系统来检查访问。问题是,即使答案不太可能改变,这些查询通常也会针对每个报告请求运行。最好能够访问会话级数据,这些数据可以在登录期间设置一次,然后从报告中访问。

3 个答案:

答案 0 :(得分:1)

使用反射,您可以访问正在运行的作业的HTTPContext,从中可以获取Session对象(具体取决于您的设置)。我们不得不将此方法用于与安全性相关的稍微不同的场景:如果您有一个使用多个数据集的报表,则只有第一个获取正确的用户上下文。这个hack允许你自己获取HTTPContext(我们在自定义数据层中使用它)。

摘自MSDN论坛文章here

using System.Reflection;
using Microsoft.ReportingServices.Diagnostics;

// This is declared outside of a method body for improved performance,
// since this reflection bit only needs to run once

private static FieldInfo contextField = 
  typeof(RunningJobContext).GetField("m_optionalWebCtx", 
                   BindingFlags.Instance | BindingFlags.NonPublic);

// Call this in your method
HttpContext context = (HttpContext)contextField.GetValue(Globals.JobContext);

答案 1 :(得分:0)

没有direct access from SSRS to session。我的建议:

  1. 在数据库中创建表以托管所有权限/组相关信息,将userID作为参数传递到存储过程。问题 - 触发此表中的更改。
  2. 使用ASP.NET作为SSRS的包装器,因此会话变量不会出现问题。 Starting with SQL Reporting Services in ASP.NET Application

答案 2 :(得分:0)

您可以更灵活地将访问权限转移到asp.net站点并使用reportviewer控件。

确保您的开发计算机和IIS计算机版本9.0.0.0 for VS 2008上具有相同版本的控件。

然后,您必须获得IIS与报告服务器设置之间的权限/访问权限,但这并不太难。

此时,您可以更好地控制设置,隐藏和控制所有参数或提供自己的参数控件。