ReportViewer - 子报表处理模拟上下文

时间:2011-02-18 17:41:18

标签: asp.net reportviewer

我有一份包含子报告的报告查看器报告。在本地运行报告工作正常,当我部署到另一台服务器时,为远程计算机上的本地用户获取SQL访问被拒绝错误。例如

对servername \ servername $

的访问被拒绝

我有一种感觉,这是因为我发出一个SQL命令来获取子报告所需的数据,当部署在服务器上时,报告查看器正在触发此命令,因为我的所有连接字符串都使用集成安全性(出于安全原因,它没有得到正确的冒充背景。

我的数据库访问类与报表程序集位于不同的程序集中,这两个程序集都是从Web应用程序引用的

当报表查看器需要获取子报表的数据时,它似乎正在调用子报表处理事件。 Web应用程序在运行时模拟用户,但子报表处理事件不使用此指定用户。可能改为使用本地系统帐户,并且当连接字符串使用集成安全性时,本地系统帐户无权访问另一台服务器上的数据库。

其他人有这个问题吗?

这是我的报告页面的代码

/// <summary>
        /// Page Load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load( object sender, EventArgs e )
        {
            try
            {
                if ( !Page.IsPostBack )
                {
                    Reporting.Common.SetReportEmbeddedResource( this.ReportViewer1, "xxx.Web.WAP.Reporting.Reports.ApprovalRouteHeader.rdlc" );

                    this.ReportViewer1.LocalReport.DataSources.Add(
                        new Microsoft.Reporting.WebForms.ReportDataSource(
                            "CostDept",
                          Reporting.Repositories.ApprovalRoute.GetHeaderApprovalRouteList() ) );

                    this.ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Local;
                    this.ReportViewer1.LocalReport.SubreportProcessing += new Microsoft.Reporting.WebForms.SubreportProcessingEventHandler( LocalReport_SubreportProcessing );

                    this.ReportViewer1.LocalReport.Refresh();
                }
            }
            catch ( Exception ex )
            {
                ErrorLogging.LogError( ex );
            }
        }

        /// <summary>
        /// Loads the sub report
        /// </summary>
        /// <param name="sender">object</param>
        /// <param name="e">args</param>
        protected void LocalReport_SubreportProcessing( object sender, Microsoft.Reporting.WebForms.SubreportProcessingEventArgs e )
        {
            try
            {
                e.DataSources.Add(
                    new Microsoft.Reporting.WebForms.ReportDataSource(
                        "CostDept",
                        Reporting.Repositories.ApprovalRoute.GetDetailApprovalRouteList(
                        Convert.ToInt32( e.Parameters[ "AccountNumberID" ].Values[ 0 ] ),
                         Convert.ToInt32( e.Parameters[ "SageDatabaseID" ].Values[ 0 ] ),
                       Convert.ToInt32( e.Parameters[ "RequestingUserID" ].Values[ 0 ] ),
                        Convert.ToInt32( e.Parameters[ "ProjectID" ].Values[ 0 ] ),
                          Convert.ToInt32( e.Parameters[ "ProjectItemID" ].Values[ 0 ] ),
                        e.Parameters[ "DocumentType" ].Values[ 0 ].ToString() ) ) );
            }
            catch ( Exception ex )
            {
                ErrorLogging.LogError( ex );
            }
        }

2 个答案:

答案 0 :(得分:0)

我想我已经深究了这一点。由于SQL服务器位于一个独立的盒子而不是Web应用程序上,因此在处理子报告时会导致“双跳”,从而丢失了身份上下文。

我想出了两个工作。

1)在sql连接字符串中使用UID和PWD,因此不使用Integrated Security

2)将IIS中的应用程序池和匿名用户访问的标识更改为对数据库具有权限的同一帐户。然后,当处理子报告时,应用程序池的标识将具有访问权限并将正确加载。

我在博客上发布了更详细的解释: WraithNath

答案 1 :(得分:0)

我遇到了将图表导入图像的类似情况。

我的图表是通过aspx页面呈现的,并且具有动态参数。在本地运行时,它工作正常。部署到我们的分期盒......它破了。与此处提到的子报告问题相同的错误。

我最终刚从图表渲染中删除了安全性(我们已经为所有数据库连接使用了UID / PWD)。

所以我认为这个问题几乎发生在报告控件的任何“子”任务中。无论是调用图像,子报告还是其他任何内容。