2009-02-20 70 views
1

有没有办法在登录时设置会话变量,然后可用于报告?在Reporting Services 2008中存储和检索会话变量

我们有一个报告服务服务器,用于移动和非规范化来自我们交易系统的数据以进行报告。为了让我们的用户使用交易系统中的相同用户名和密码登录,我们已经设置了自定义表单身份验证,经过大量的试验和错误,终于可以正常工作。另外,我们有权访问我们的交易系统,以便用户权限的任何更改立即反映在Reporting Services中。

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

回答

1

使用反射,您可以访问正在运行的作业的HTTPContext,从中可以获取Session对象(取决于您的设置)。我们必须使用这种方法来处理与安全性有关的稍微不同的场景:如果您的报告使用多个数据集,则只有第一个获取正确的用户上下文。这个破解允许你自己获取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); 
0

你肯定有更多的灵活性将访问到一个asp.net网站,并使用ReportViewer控件。

请确保您有相同的版本既您的开发机上的IIS机器上的控制,版本9.0.0.0对VS 2008

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

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