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 的嵌入式报表
- 将报表添加到项目中。
这将创建一个嵌入式报表类。还将创建一个缓存报表类,它将加载并返回该嵌入式报表类的缓存实例。
实例化该缓存报表类。
将该缓存类实例赋给 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 的实用程序类保持非嵌入式报表
- 创建您自己的缓存管理实用程序类并设置其实现 ICachedReport。
- 在此实用程序类中,使用 ReportDocument.Load() 方法从路径字符串加载非嵌入式报表。
- 对实现方法 CreateReport() 进行编码以返回此非嵌入式报表的 ReportDocument 实例。
- 实例化该报表缓存管理实用程序类。
- 将该类实例赋给 CrystalReportViewer 控件。
注意若要了解完成此过程的详细示例,请参见“绑定到已加载到缓存管理实用程序类的非嵌入式报表”。
使用 Cache 保持 ReportDocument 对象模型的限制
Cache 是用来跨用户保持具有高可共享性的 ReportDocument 实例的最佳方法。如果报表是特定用户的,使用 Cache 将导致服务器内存的浪费。这是因为 Cache 在应用程序级创建基于用户的实例,这些实例在用户到期后仍保留在服务器内存中。因此应该将特定用户的报表赋给 Session。
注意 |
|---|
在大多数情况下,使用 Session 保持 ReportDocument 实例。只有当报表具有高可共享性并且报表非常大,或者报表非常复杂以致需要几分钟才能检索到数据时,才使用 Cache(或更加明确地说,使用 ICachedReport 接口)。 |
比较 Cache 和 ViewState
Cache 主要用于保持代码隐藏类中对象的状态。ViewState 主要用于保持 Web 页上控件的状态。当 Web 页上的控件被绑定到代码隐藏类中的对象,并且两者都需要在页重新加载过程中保持状态时,Cache 和 ViewState 将共同实现持久性。
在这种情况下,ViewState 保持 CrystalReportViewer 控件,而 Cache 保持绑定到该控件的 ReportDocument 对象。