1

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

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

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

4

3 回答 3

1

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

此处摘自 MSDN 论坛文章:

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);
于 2009-02-24T10:34:58.233 回答
0

将访问权限移至 asp.net 站点并使用 reportviewer 控件,您肯定有更多的灵活性。

确保您的开发机器和 IIS 机器上的控件版本相同,VS 2008 版本为 9.0.0.0。

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

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

于 2009-02-24T10:48:33.943 回答
0

SSRS不能直接访问 session。我的建议:

  1. 在数据库中创建表以托管所有权限/组相关信息,将 userID 作为参数传递给存储过程。问题 - 触发此表中的更改。
  2. 使用 ASP.NET 作为 SSRS 的包装器,因此会话变量不会有问题。从 ASP.NET 应用程序中的 SQL Reporting Services 开始
于 2009-02-22T11:08:58.730 回答