ReportViewer - контекст олицетворения обработки подотчета

У меня есть отчет Reportviewer с дополнительным отчетом. При локальном запуске отчет работает нормально, когда я развертываю на другом сервере и получаю ошибку отказа в доступе SQL для локального пользователя на удаленном компьютере. например

доступ запрещен для servername \ servername $

У меня такое чувство, что это связано с тем, что я запустил команду SQL для получения данных, необходимых для вспомогательного отчета, и при развертывании на сервере средство просмотра отчетов запускает эту команду, и потому что все мои строки подключения используют встроенную безопасность (по соображениям безопасности ) тогда он не получил правильного контекста олицетворения.

Мой класс доступа к базе данных находится в другой сборке, чем сборка отчетов, на обе эти сборки ссылается веб-приложение.

Похоже, что средство просмотра отчетов вызывает событие обработки подотчета, когда ему нужно получить данные для подотчета. Веб-приложение олицетворяет пользователя при запуске, но событие обработки подотчета не использует этого указанного пользователя. Вместо этого, возможно, вместо этого используется локальная системная учетная запись, и поскольку строки подключения используют интегрированную безопасность, локальная системная учетная запись не имеет доступа к базе данных, которая находится на другом сервере.

У кого-то еще есть такая проблема?

вот код для моей страницы отчета

/// <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 );
            }
        }

person WraithNath    schedule 18.02.2011    source источник


Ответы (2)


Думаю, я дошел до сути этого. Поскольку сервер SQL находится в отдельном блоке, чем веб-приложение, при обработке подотчета возникает «двойной прыжок», который теряет контекст идентификации.

Я придумал два решения.

1) Используйте UID и PWD в строках подключения sql, чтобы встроенная безопасность не использовалась

2) Измените идентификацию пула приложений и анонимного доступа пользователей в IIS на ту же учетную запись, которая имеет разрешения в базе данных. Затем, когда подотчет будет обработан, идентификатор пула приложений получит доступ и загрузится правильно.

Я разместил более подробное объяснение в своем блоге: WraithNath

person WraithNath    schedule 19.02.2011

Я столкнулся с аналогичной ситуацией при импорте диаграммы в изображение.

Моя диаграмма была отрисована через aspx-страницу и имела динамические параметры. При запуске локально все работало нормально. Развертывание в нашу промежуточную коробку ... сломалось. Те же ошибки, что и в упомянутом здесь дополнительном отчете.

Наконец, я просто удалил безопасность из рендеринга диаграммы (мы уже использовали UID / PWD для всех подключений к БД).

Поэтому я думаю, что эта проблема возникает практически с любой «подзадачей» для управления отчетами. Будь то вызов изображений, подотчетов или чего-то еще.

person Eric Burdo    schedule 22.03.2011