使用 ReportViewer 控件呈现没有参数的 SSRS 报告失败

Rendering SSRS report, with no parameters, using ReportViewer control fails

我正在使用 ASP.Net 页面,该页面使用 ReportViewer 控件显示来自远程 SSRS 服务器的报告。在我们部署一个没有 require/accept 任何参数的新报告之前,它一直没有问题。呈现这些报表时,报表的第一页可以正常呈现,但是当您切换到另一页(使用 ReportViewer 中的控件)时,您会收到一条错误消息,显示 "One or more data sources is missing credentials".

这是 ReportViewer 的配置方式...

this.Report.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
this.Report.ServerReport.ReportServerUrl = new Uri(App.Config.ReportServerPath);
this.Report.ServerReport.ReportPath = this.ReportPath;
this.SetRerportParameterValues(); // This does nothing since the report doesn't have any parameters
this.Report.AsyncRendering = false;

如果我将 AsyncRendering 更改为 true,则在呈现报告的第一页时会显示错误。

在呈现没有任何参数的报表时,我必须对参数做一些不同的事情吗?

最好删除

this.SetRerportParameterValues();

因为这似乎什么都不做。

而且,您确定此 非常 报告中没有任何子报告吗?如果是,您可能需要检查其 query/data 来源等

编辑

有一些known issues with the reportviewer控件。 我个人在设计报表时仅将 reportviewer 作为基本查看器,因为从用户的角度来看,由于某些问题,reportViewer 不是最佳选择。
因此,为了让报告数据输出显示给用户,更好的选择是 convert report to PDF on the fly 从代码隐藏,并将 PDF 显示给用户。

我仍然不确定为什么会发生这种情况,但我确实找到了原因并能够解决它。

我的 ASPX 页面继承自自定义页面库(它继承了 System.Web.UI.Page)。基页的初始化循环遍历页面上的所有 HTML 控件,并将一个简单的处理程序附加到更改事件。当控件的值被修改时,事件处理程序会简单地将控件添加到列表中。这个事件处理程序非常简单,看起来像这样...

 private void HtmlCtrl_ServerChange(object sender, EventArgs e)
    {
        HtmlControl ctrl = sender as HtmlControl;
        if (ctrl != null)
        {
            this.changedControls.Add(ctrl);
        }
    }

出于某种原因,我仍然不确定为什么当您尝试使用零参数导航到报表的第二页时,此功能会弄乱 ReportViewer 控件。为了解决这个问题,我刚刚在我的基本页面 class 中添加了一个额外的 属性,这使我可以禁用更改跟踪功能,因为无论如何这个页面都不需要它。