Обработка исключений отчетов с использованием ASP.NET ReportViewer в удаленном и асинхронном режимах - PullRequest
2 голосов
/ 18 сентября 2009

У меня есть страница отчета, которая использует компонент Microsoft.Reporting.WebForms.ReportViewer для асинхронной визуализации отчетов сервера отчетов (SSRS). В момент возникновения ошибки в элементе управления ReportViewer отображается сообщение.

Я хочу добавить собственную логику обработки ошибок, чтобы пользователь получал дружеское сообщение. Как я могу добиться этого и по-прежнему запускать средство просмотра в асинхронном режиме, отображая отчеты на сервере SSRS?

Прослушивание события ReportViewer.HandleError не будет работать, поскольку обратная передача страницы уже завершена.

1 Ответ

1 голос
/ 21 сентября 2009

После проверки JavaScript в ReportViewer я нашел следующее решение. Это может привести к поломке, если Microsoft изменит этот конкретный метод. Следующий код будет добавлен в заголовок страницы, чтобы убедиться, что он запускается после загрузки javascript ReportViewer, но до создания экземпляра RSClientController.

// This replaces a method in the ReportViewer javascript. If Microsoft updates 
// this particular method, it may cause problems, but that is unlikely to 
// happen.The purpose of this is to redirect the user to the error page when 
// an error occurs. The ReportViewer.ReportError event is not (always?) raised 
// for Remote Async reports
function OnReportFrameLoaded() {
    this.m_reportLoaded = true;
    this.ShowWaitFrame(false);

    if (this.IsAsync)
    {
        if(this.m_reportObject == null)
        {
            window.location = 
                '<%= HttpRuntime.AppDomainAppVirtualPath %>/Error.aspx';
        }
        else
        {
            this.m_reportObject.OnFrameVisible();
        }
    }
}
RSClientController.prototype.OnReportFrameLoaded = OnReportFrameLoaded;

Исходный код из файла сценария Microsoft ReportViewer (внутри Microsoft.ReportViewer.WebForms, 8.0.0.0, .Net Framework 3.5 SP1):

function OnReportFrameLoaded()
{
    this.m_reportLoaded = true;
    this.ShowWaitFrame(false);

    if (this.IsAsync && this.m_reportObject != null)
        this.m_reportObject.OnFrameVisible();
}
RSClientController.prototype.OnReportFrameLoaded = OnReportFrameLoaded;
...