是否有办法在登录期间设置会话变量,然后可用于报告?
我们有一个报告服务服务器,我们从交易系统中移动和反规范化数据以进行报告。为了允许我们的用户使用相同的用户名和密码从事务系统登录,我们已经设置了自定义表单身份验证,经过多次试验和错误后,它终于正常工作。此外,我们还拥有访问我们的交易系统的授权,因此用户权限的任何更改都会立即反映在Reporting Services中。
我们现在的问题是我们想添加一些额外的功能,例如根据事务系统中的用户权限/组锁定参数。我们已经找到了一种方法,但效率很低,基本上我们有存储过程来查询我们的事务系统来检查访问。问题是,即使答案不太可能改变,这些查询通常也会针对每个报告请求运行。最好能够访问会话级数据,这些数据可以在登录期间设置一次,然后从报告中访问。
答案 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。我的建议:
答案 2 :(得分:0)
您可以更灵活地将访问权限转移到asp.net站点并使用reportviewer控件。
确保您的开发计算机和IIS计算机版本9.0.0.0 for VS 2008上具有相同版本的控件。
然后,您必须获得IIS与报告服务器设置之间的权限/访问权限,但这并不太难。
此时,您可以更好地控制设置,隐藏和控制所有参数或提供自己的参数控件。