为 ReportViewer Web 服务器控件指定连接和凭据

若要指定从**“ReportViewer”**控件到报表服务器的连接,最好先了解连接的建立条件。

  • 启动时,将加载包含 ReportViewer 控件的网页,该控件会连接至报表服务器,以便建立报表会话、获取或设置报表参数属性,以及检索服务器上可用的呈现扩展插件的列表。

  • 如果该控件运行时采用 AsyncRendering=true 设置,则在呈现页面后,将由 IFrame 对象异步检索报表的 HTML。

  • 如果报表引用了外部图像,**“ReportViewer”控件将使用“ReportViewer”**HTTP 处理程序通过发出单独的请求来检索这些图像,其中每个请求都通过其自己的连接发出。

  • 呈现报表后,如果要将呈现的报表导出为其他格式,则会建立其他连接。导出请求将使用单独的连接从浏览器发送至报表服务器。

所有这些操作是否成功取决于**“ReportViewer”**控件是否具有报表服务器的有效连接信息。根据您要使用 Forms 身份验证、Windows 身份验证、当前用户的凭据还是 ASP.NET 会话等因素,指定连接信息的方式将所有不同。

如何指定连接

若要连接至服务器,可以设置 ServerReport 对象的属性,或实现设置连接的接口并在 Web.config 文件中指定该实现。**“ReportViewer”**控件始终会先读取 Web.config 文件并使用其中指定的连接值。

如果启用了会话状态,则可以选择是设置 ServerReport 对象的属性,还是在 Web.config 文件中指定连接信息。如果在 Web.config 中指定连接信息,则不要设置 ServerReport 对象的属性。

如果关闭了会话状态,则必须实现 IReportServerConnectionIReportServerConnection2,然后在 Web.config 文件中指定该实现。

Note注意

建立连接时使用的用户帐户必须在报表服务器上具有有效的角色分配。系统级和项目级角色分配都用于创建全面的权限集。如果您不熟悉报表服务器角色分配,可以找一本教程来学习角色分配的基础知识。有关更多信息,请参见 MSDN 上的 Tutorial: Setting Permissions in Reporting Services(教程:在 Reporting Services 中设置权限)。

设置 ServerReport 对象的属性

在设计时,当您将该控件拖动到 Web 窗体上时,可以设置 ServerReport 对象的报表服务器 URL 和超时属性。

默认情况下,**“ReportViewer”**Web 服务器控件会以 ASP.NET 线程用户的身份连接至报表服务器。

若要以其他用户的身份进行连接(例如,如果要让所有用户都使用单个用户帐户连接至报表服务器),请对一个可序列化对象实现 IReportServerCredentials,并将该对象的实例传递给 ReportViewer.ServerReport.ReportServerCredentials。由于**“ReportViewer”**控件可以在 ASP.NET 页完成处理后连接至报表服务器,因此如果 ASP.NET 会话存储在进程之外(例如存储在 SQL Server 数据库中),该对象必须是可序列化的对象才能进行存储。

请注意,直接设置 ReportViewer.ServerReport.ReportServerCredentials 属性有两个缺点:

  • 必须启用 ASP.NET 会话。

  • ASP.NET 会话会在不必要的情况下变得很大,这是因为对于查看该页的每个用户,**“ReportViewer”**控件都会在会话中放置该对象的一个实例。

通过在 Web.config 文件中指定 IReportServerConnection2 的实现,可以避免上述缺点。

有关如何在关闭会话状态时指定凭据的建议,请参见本主题中的关闭 ASP.NET 会话时的凭据存储准则。

在 Web.config 中指定报表服务器连接

实现 IReportServerConnectionIReportServerConnection2 时,必须在应用程序的 Web.config 文件中指定实现。Web.config 文件提供了包含连接和凭据信息的对象类型。

Note注意

在 Web.config 文件中,必须指定 IReportServerConnection2IReportServerConnection 而非 IReportServerCredentials 的实现。IReportServerConnection2 派生自 IReportServerCredentials,它可以添加其他属性来指定要使用的报表服务器 URL、超时值以及任何自定义 Cookie 或 HTTP 标头。

虽然在关闭 ASP.NET 会话时需要使用 IReportServerConnection2,但如果要避免在会话中存储对象,也可以在打开 ASP.NET 会话时使用该属性。有关更多信息和代码示例,请参见 IReportServerConnection2 的编程参考主题。有关如何在 Web.config 中添加项的更多信息,请参见 ReportViewer 的 Web.config 设置

下表汇总了提供凭据和连接信息的接口。

接口 说明

IReportServerCredentials

可以使用此接口在不想以当前用户身份进行连接时指定 ServerReport 对象用于连接至报表服务器的凭据。

默认情况下,“ReportViewer”控件会以 ASP.NET 线程用户的身份连接至报表服务器。

通过将 ReportViewer.ServerReport.ReportServerCredentials 设置为您自己的 IReportServerCredentials 的实现实例,可以指定其他用户。

IReportServerConnection

此接口继承自 IReportServerCredentials,用于提供其他成员来指定报表服务器 URL 和超时属性。

IReportServerConnection2

此接口继承自 IReportServerConnection,用于提供其他成员来指定自定义 Cookie 或标头。如果报表服务器中使用了单一登录产品,此接口将十分有用。

关闭 ASP.NET 会话时的凭据存储准则

实现 IReportServerConnection2 时,不要将用户凭据存储在类中。如果将凭据存储在可序列化对象中,用户名和密码将被序列化为 ASP.NET 会话并存储在 SQL Server 数据库或其他状态服务器中。虽然序列化凭据未必会构成安全风险,但将凭据存储为会话数据确实会增大受攻击面。

下面是一些方法示例,它们演示如何避免将凭据与其他会话数据存储在一起:

  • 从配置文件或某些其他配置存储中读取存储的凭据。有关更多信息和代码示例,请参见 IReportServerCredentials 的编程参考主题。

  • 从 ASP.NET 请求中读取 HTTP Cookie,以基于客户端提供不同的凭据。

Note注意

虽然您可以灵活选择在类外部存储凭据的方式,但必须确保在同一报表会话中为后续请求返回相同的凭据。

另请参见

参考

IReportServerCredentials
IReportServerConnection2

概念

ReportViewer 的 Web.config 设置
配置 ReportViewer 以实现异步呈现
服务器报表的部署注意事项
将 ReportViewer 配置为进行远程处理
添加和配置 ReportViewer 控件