Cache 和 ReportDocument 对象模型的持久性

Cache 是 ASP.NET 中用于保持状态的基于服务器的方法。Cache 在功能上类似于 ASP 和 ASP.NET 中的 Application 对象:

  • Application 允许跨应用程序范围保持任何对象。
  • 放置在 Application 中的对象对所有用户可用。但 Application 对于整个应用程序通用,并不是为保存特定用户的信息而设计。

Cache 具有 Application 的所有这些功能,但它添加了新的智能级别用于管理瞬态数据:

  • 可以使用基于文件的、基于关键字的或基于时间的依赖项对添加到缓存的对象进行配置。如果关联的文件或关键字更改,或者经过了一段指定的时间,则将从缓存中自动删除对象,下次需要该对象时将在缓存中放置更新的版本。
  • 添加到缓存中没有依赖项且使用频率不高的对象将自动过期。
  • 从缓存中删除对象时,将触发事件。可以对该事件编写要运行的代码并将对象的更新版本加载到 Cache 中。

如果使用原来的关键字字符串添加对象的替代版本,则它将覆盖以前的版本。为防止发生覆盖,请将替代定义连接到关键字字符串,以使对象的每个替代版本都是唯一的。

Cache 优于 Application 之处在于它不仅可以像 Application 那样存储所有用户都可以访问的信息,而且 Cache 还可以根据其依赖项中的更改对自身进行更新。

此持久性方法的限制

刚开始接触 Cache 的开发人员可能倾向于对持久性处处都使用 Cache,包括用 Cache 代替 Session。但是,Cache 并不能代替 Session 对象的功能。如果试图通过将特定用户的数据连接到 Cache 关键字来模拟 Session 的唯一性,会导致用户对象占满 Cache;而与 Session 不同,这些对象并不会在用户超时时间过后过期。其结果将是,Cache 对 Web 服务器内存的要求要比 Session 对象高得多。

如果需要保持特定用户的数据,则仍应使用 Session 对象。

有关替代的持久性方法,请参见:

使用 Cache 保持 ReportDocument 对象模型

如果已将报表封装到 ReportDocument 对象模型中,则必须使用基于服务器的方法(例如 Session 或 Cache)保持 ReportDocument 对象模型。

可以采用下面两种方式中的一种来使用 Cache,以保持 ReportDocument 对象模型中的报表:

  • 实例化报表,然后使用将报表赋给 Session 对象的相同语法将其赋给 Cache 对象。
此方法只用于具有高可共享性的报表,其中 ReportDocument 实例只出现一次,并只使用一组参数和登录凭据。对于可能因参数和登录信息变化而多次出现的 ReportDocument 实例,使用相同的关键字字符串重新赋给 Cache 对象将覆盖 ReportDocument 实例以前的版本。有关具有高可共享性缓存的信息,请参见[“缓存具有“高可共享性”的报表”](ms225489\(v=vs.90\).md)。
  • 实例化用于实现 ICachedReport 接口的报表类的一个版本。
Crystal Reports SDK 具有一个内置的报表缓存框架。它会根据参数和用户登录凭据使用唯一的关键字把实现 ICachedReport 接口的任何报表自动添加到缓存中。此方法适用于具有高可共享性的任何报表,但可能因为参数和登录凭据中的微小变化而具有几个版本。对于具有低可共享性的报表(即特定用户的报表),则应将它们赋给 Session 对象。

保持实现 ICachedReport 的嵌入式报表

  1. 将报表添加到项目中。
这将创建一个嵌入式报表类。还将创建一个缓存报表类,它将加载并返回该嵌入式报表类的缓存实例。
  1. 实例化该缓存报表类。

  2. 将该缓存类实例赋给 CrystalReportViewer 控件。

<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>若要了解完成此过程的详细示例,请参见<a href="ms227391(v=vs.90).md">“ 绑定到缓存的嵌入式报表类 ”</a>。</p></td>
</tr>
</tbody>
</table>

通过实现 ICachedReport 的实用程序类保持非嵌入式报表

  1. 创建您自己的缓存管理实用程序类并设置其实现 ICachedReport。
  2. 在此实用程序类中,使用 ReportDocument.Load() 方法从路径字符串加载非嵌入式报表。
  3. 对实现方法 CreateReport() 进行编码以返回此非嵌入式报表的 ReportDocument 实例。
  4. 实例化该报表缓存管理实用程序类。
  5. 将该类实例赋给 CrystalReportViewer 控件。
    Note注意

    若要了解完成此过程的详细示例,请参见“绑定到已加载到缓存管理实用程序类的非嵌入式报表”

使用 Cache 保持 ReportDocument 对象模型的限制

Cache 是用来跨用户保持具有高可共享性的 ReportDocument 实例的最佳方法。如果报表是特定用户的,使用 Cache 将导致服务器内存的浪费。这是因为 Cache 在应用程序级创建基于用户的实例,这些实例在用户到期后仍保留在服务器内存中。因此应该将特定用户的报表赋给 Session。

Note注意

在大多数情况下,使用 Session 保持 ReportDocument 实例。只有当报表具有高可共享性并且报表非常大,或者报表非常复杂以致需要几分钟才能检索到数据时,才使用 Cache(或更加明确地说,使用 ICachedReport 接口)。

比较 Cache 和 ViewState

Cache 主要用于保持代码隐藏类中对象的状态。ViewState 主要用于保持 Web 页上控件的状态。当 Web 页上的控件被绑定到代码隐藏类中的对象,并且两者都需要在页重新加载过程中保持状态时,Cache 和 ViewState 将共同实现持久性。

在这种情况下,ViewState 保持 CrystalReportViewer 控件,而 Cache 保持绑定到该控件的 ReportDocument 对象。

请参见