1)缓存 ASP.NET 页
1以编程方式操作 HttpCachePolicy 类。
HttpCachePolicy.SetExpires
HttpCachePolicy.SetCacheability |NoCache
|Private
|Public
|Server
|ServerAndNoCache
|ServerAndPrivate
2<%@ OutputCache Duration="60" VaryByParam="None" %>Duration 和 VaryByParam 属性是必需的。
2)缓存 ASP.NET 页的某些部分
不变的部分缓存起来,不必总是请求服务器
控件头部,则该控件的一个版本将在输出缓存中存储 120 秒。
<%@ OutputCache Duration="120" VaryByParam="None" %>
或使用代码隐藏开发方法开发用户控件,则将以下属性包含在类声明的元数据中时,控件版本将在输出缓存中存储 120 秒。
[C#]
[PartialCaching(120)]
以上两法将仅缓存用户控件。
也可嵌套使用,在已缓存的页面或控件中缓存控件。
您可以在已为输出缓存指定的用户控件标记中声明 ID 属性,从而可以针对该用户控件的实例进行编程。但是,为了使代码正常工作,您必须显式验证该用户控件在输出缓存中存在。
!!可能的错误:
如果编写代码来操作一个包含 @ OutputCache 指令的用户控件,则将出现错误。
另外,如果页输出缓存设置为 100 秒,而用户控件输出缓存设置为 50 秒,则整个页将在输出缓存中存储 100 秒,而与用户控件较短的时间设置无关。
不过,如果页输出缓存存储持续时间比用户控件存储持续时间短,则将一直使用缓存用户输出控件,直到其存储时间到期为止,即使该页的其余部分已为某个请求重新生成。例如,如果页输出缓存设置为 50 秒,而用户控件输出缓存设置为 100 秒,则页的其余部分每到期两次,用户控件就到期一次。
3)缓存应用程序数据
允许您将需要大量的服务器资源来创建的对象存储在内存中。它是由 Cache 类实现的,实例是每个应用程序专用的,其生存期依赖于该应用程序的生存期。重新启动应用程序后,将重新创建 Cache 对象。
见:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcacheapis.htm
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(总论)
允许您将需要大量的服务器资源来创建的对象存储在内存中。它是由 Cache 类实现的,实例是每个应用程序专用的,其生存期依赖于该应用程序的生存期。重新启动应用程序后,将重新创建 Cache 对象。
ASP.NET 为您提供了一个强大的、便于使用的缓存机制,允许您将需要大量的服务器资源来创建的对象存储在内存中。它是由 Cache 类实现的,实例是每个应用程序专用的,其生存期依赖于该应用程序的生存期。重新启动应用程序后,将重新创建 Cache 对象。
设计 Cache 类是为了便于使用。通过使用与值成对的键,您可以将项放置在 Cache 中并在以后检索它们。有关如何进行该操作的示例,请参见将项添加到缓存中和检索缓存项的值。
Cache 类为您提供了一个简单的接口来自定义缓存设置,它还提供了强大的功能允许您自定义如何缓存项以及将它们缓存多长时间。例如当缺乏系统内存时,缓存自动移除很少使用的或不重要的项以允许使用内存来处理大量的请求。这种技术叫做清理。这是缓存确保非当前数据不使用宝贵的服务器资源的一种方式。
当执行清理时,您可以指示 Cache 给予某些项比其他项更高的优先级。若要指示特定项比其他项具有较高或较低的重要性,请在使用 Cache.Add 方法或 Cache.Insert 方法添加项时指定一个 CacheItemPriority 枚举值。
当使用 Add 方法或 Insert 方法将项添加到 Cache 时,您还可以建立项的到期策略。您可以通过使用 absoluteExpiration 参数定义项的生存期,该参数为 DateTime 类型,它允许您指定该项的确切到期时间。您还可以使用 slidingExpiration 参数,该参数为 TimeSpan 类型。它允许您根据访问项的时间来指定该项到期之前的运行时间。一旦该项到期,便将它从缓存中移除。试图检索其值将返回 null,除非该项被重新添加到 Cache 中。
对于存储在 Cache 中的易失项(例如那些经常进行数据刷新的项或那些只在一段时间内有效的项),设置一种到期策略,只要这些项的数据保持为最新的,就将它们保留在 Cache 中。例如,如果您正在编写一个应用程序,该应用程序通过从一个经常更新的 Web 站点获得数据来跟踪体育比赛的比分,那么只要源 Web 站点上比赛的比分不更改,就可以缓存这些比分。在此情况下,您可以根据该 Web 站点更新比分的频率来设置到期策略。您可以编写代码来确定 Cache 中是否是最新的比分。如果该比分不是最新的,则该代码可以从源 Web 站点更新比分。
最后,ASP.NET 允许您根据外部文件、目录或另一个缓存项定义缓存项的有效性。这些叫做文件依赖项和键依赖项。如果依赖项更改,则缓存项失效并被从 Cache 中移除。您可以使用该技术在项的数据源更改时从 Cache 中移除这些项。例如,如果您编写一个处理 XML 文件中财务数据的应用程序,并将其呈现在图形中,则您可以从该文件将数据插入 Cache 并在该 XML 文件上保留一个依赖项。当该文件更新时,从缓存中移除该项,您的应用程序重新读取该文件,然后插入该项的一个新版本。
注意 Cache 没有关于它所包含项的内容的信息。它只保留对这些对象的引用。它还提供跟踪它们的依赖项和设置到期策略的方法。
(1)
将项添加到缓存中
您可以使用三种不同的技术将项添加到 Cache 对象中。根据应用程序要求的不同,您的选择可以从简单到复杂。
如果要利用 Cache 所提供的清理、到期时间和依赖项支持,则必须使用 Cache.Insert 方法或 Cache.Add 方法。
注意 Add 和 Insert 方法具有相同的签名,但它们之间存在细微的差别。首先,调用 Add 方法返回表示缓存项的对象,而调用 Insert 方法不是。其次,如果您调用这些方法并将已存储在 Cache 中的某个项添加到 Cache 中,那么它们的行为是不同的。Insert 方法替换该项,而 Add 方法失败。
通过指定其键和值将项添加到缓存中
通过指定项的键和值,您可以像将项添加到字典中一样将其添加到缓存中。下面的代码将文本框的当前 Value 属性添加到 Cache 中。
[Visual Basic]
Cache("txt1") = txtName.value
[C#]
Cache["txt1"] = txtName.value;
通过使用 Insert 方法将项添加到缓存中
重载 Insert 方法,允许您定义正在使用的版本的参数的值。例如,若要只添加项的键和值,则使用下面的代码。
[Visual Basic]
Cache.Insert("MyData1", connectionString)
[C#]
Cache.Insert("MyData1", connectionString);
使用 Add 方法将项添加到缓存中
Add 方法与 Insert 方法具有相同的签名,但它返回表示您所添加项的对象。
[Visual Basic]
Cache.Add("MyData1", connectionString)
[C#]
Cache.Add("MyData1", connectionString);
这两种方法都使您能够在很大程度上控制在 Cache 中保留项的条件。两种方法都支持使缓存的项依赖于外部文件或目录、Cache 中的其他键或任意一个的数组。将设有依赖项的项添加到 Cache 中将创建 CacheDependency 类的实例,它跟踪对您定义的依赖项的更改。如果这些依赖项的任何一个发生更改(包括被删除或移动),则将与该依赖项关联的项从 Cache 中移除。
将设有依赖项的项添加到缓存中
您可以使用 Add 或 Insert 方法中的 dependencies 参数将设有依赖项的项添加到 Cache 中。下面的示例演示使用 Insert 方法将设有依赖项(在 XML 文件上)的项添加到 Cache 中。
[C#]
Cache.Insert("MyData1", connectionString, new CacheDependency(Server.MapPath(//myServer/myConfig.xml)));
[Visual Basic]
Cache.Insert("MyData1", connectionString, new CacheDependency(Server.MapPath(//myServer/myConfig.xml)))
将设有到期策略的项添加到缓存中
您可以使用 absoluteExpiration parameter 参数和 slidingExpiration 参数将设有到期策略的项添加到 Cache 中。您可以定义绝对过期时间或弹性过期时间,但不能同时定义两者。在使用上述参数之一定义到期策略时,必须将另一个参数设置为零。Cache 类定义了两个自动执行该操作的字段:NoAbsoluteExpiration 和 NoSlidingExpiration。当定义绝对或弹性过期时间时,只要将适当的参数设置为其相应的字段值即可。下面的示例使用 Insert 方法将设有两分钟绝对到期时间的项添加到 Cache 中。
[C#]
Cache.Insert("MyData1", connectionString, null, DateTime.Now.AddMinutes(2), NoSlidingExpiration);
[Visual Basic]
Cache.Insert("MyData1", connectionString, null, DateTime.Now.AddMinutes(2), NoSlidingExpiration)
下面的代码使用 Insert 方法将设有 30 秒弹性过期时间的项添加到 Cache 中。
[C#]
Cache.Insert("MyData1", connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30));
[Visual Basic]
Cache.Insert("MyData1", connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30))
注意 当设置绝对到期时间时,请使用 DateTime 结构。当设置弹性过期时间时,请使用 TimeSpan 结构。另外,如果您创建的弹性过期时间小于零或大于一年,则将引发 ArgumentOutOfRangeException 类。
您还可以使用 Add 或 Insert 方法通过在 CacheItemPriority 枚举中指定值定义缓存项的相对重要性。当 Web 服务器进行清理以释放内存时,这些相对优先级会对它有所帮助。Web 服务器会在移除具有较高优先级的项之前先从 Cache 中移除具有较低优先级的项。
将设有优先级设置的项添加到缓存中
您可以通过在 Add 或 Insert 方法上使用 priority 参数将设有优先级设置的项添加到 Cache 中。下面的示例使用 Add 方法将 priority 为 High 的项添加到 Cache 中。
[C#]
Cache.Add("MyData1", connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30), CacheItemPriority.High, null);
[Visual Basic]
Cache.Add("MyData1", connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30), CacheItemPriority.High, null)
(2)
从缓存中删除项时通知应用程序
ASP.NET 提供 CacheItemRemovedCallback 委托。它定义编写事件处理程序时使用的签名,当从缓存中删除项时,该事件处理程序将进行响应。ASP.NET 还提供 CacheItemRemovedReason 枚举,您可以使用该枚举使事件处理程序依赖于删除该项的原因。
当从缓存中删除某项时通知应用程序
创建引发 CacheItemRemovedCallback 委托的事件的局部变量。例如,下面的代码创建类型为 CacheItemRemovedCallback 的 onRemove 局部变量。
private static CacheItemRemovedCallback onRemove = null;
注意 该变量必须为此类型,以便用于第四步中 Cache.Add 或 Cache.Insert 方法的 onRemoveCallback 参数。
创建一个当从缓存中移除该项时进行响应的事件处理程序。例如,下面的代码将静态 Boolean itemRemoved 设置为 true,将静态 CacheItemRemovedReason reason 设置为当从缓存中移除该项时传递的值。
注意 使用 CacheItemRemovedReason 枚举的成员为此步骤中的方法创建条件代码是您可以选择的一种方法。
[C#]
CacheItemRemovedReason reason;
public void RemovedCallback(string key, object value, CacheItemRemovedReason callbackreason) {
reason = r;
}
[Visual Basic]
Dim reason As CacheItemRemovedReason
Public Sub RemovedCallback(key As String, value As Object, reason As CacheItemRemovedReason)
reason = r
End Sub
注意 该事件处理程序必须使用与 CacheItemRemovedCallback 委托相同的签名。此代码假设您已创建了两个静态变量:类型为 Boolean 的 itemRemoved 和类型为 CacheItemRemovedReason 的 reason。
创建调用事件处理程序的 CacheItemRemovedCallback 委托的实例。下面的代码调用第二步中创建的方法。
onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
使用 Cache.Add 方法或 Cache.Insert 方法将项添加到 Cache 中。您必须在 onRemoveCallback 参数中指定第一步中创建的局部变量。下面的代码使用 Insert 方法将项添加的缓存中,该项的键为 "MyData1",值为 Source。它在 onRemoveCallback 参数中定义 onRemove 变量。
Cache.Insert("MyData1", Source, null, DateTime.Now.AddMinutes(2), NoSlidingExpiration, CacheItemPriority.High, onRemove);
当第四步中添加的项由于任何原因从 Cache 中移除时,将调用 RemovedCallback 方法,并且可以访问它其中的代码以将新内容呈现到请求客户端或以一种您选择的适当方式通知应用程序。
(3)
检索缓存项的值
以下代码创建一个 Source DataView 对象,尝试检索分配了键 MyData1 的缓存数据,并将该数据分配给 Source。然后,确认该数据是否仍存储在 Cache 中,并将 Source 作为 DataGrid Web 服务器控件 MyDataGrid 的 DataSource 属性分配。最后,将该数据绑定到 MyDataGrid。
[C#]
DataView Source;
Source = (DataView)Cache["MyData1"];
if(Source != null ) {
MyDataGrid.DataSource = Source;
MyDataGrid.DataBind();
}
检查某项是否存在于缓存中
下面的示例修改上一个过程中的代码以检查缓存的数据是否存在。如果它不在缓存中,则该示例重新创建它并将其添加到 Cache 中。
[C#]
DataView Source = (DataView)Cache["MyData1"];
if (Source == null) {
SqlConnection myConnection = new SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs");
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "Authors");
Source = new DataView(ds.Tables["Authors"]);
Cache["MyData1"] = Source;
}
MyDataGrid.DataSource=Source;
MyDataGrid.DataBind();