NET 缓存.docx
《NET 缓存.docx》由会员分享,可在线阅读,更多相关《NET 缓存.docx(23页珍藏版)》请在冰豆网上搜索。
NET缓存
生成高性能、可缩放的Web应用程序最重要的因素之一是能够在首次请求项时将这些项存储在内存中,不管它们是数据对象、页还是页的某些部分。
可以将这些项存储在Web服务器上或请求流中的其他软件上,例如代理服务器或浏览器。
使您能够避免重新创建满足先前请求的信息,尤其是那些需要大量处理器时间或资源的信息。
这就是通常所说的缓存,它允许您使用多种技术跨HTTP请求存储页输出或应用程序数据并对其进行重复使用。
这样,服务器不需要重新创建信息,从而节省了时间和资源。
ASP.NET提供了两种您可以用来创建高性能Web应用程序的缓存类型。
第一种叫做输出缓存,它允许将动态页或用户控件响应存储在输出流(从发起服务器到请求浏览器)中任何具备HTTP1.1缓存功能的设备上。
当后面的请求发生时,不执行页或用户控件代码,缓存的输出用于满足该请求。
第二种类型的缓存是传统的应用程序数据缓存,可以使用它以编程方式将任意对象(例如数据集)存储到服务器内存,这样您的应用程序可以节省重新创建这些对象所需的时间和资源。
设置页缓存的到期时间
若要将页添加到输出缓存中,您必须建立该页的到期策略。
您可以使用@OutputCache指令以声明方式完成该操作,或使用HttpCachePolicy.SetExpires方法以编程方式完成该操作。
默认情况下,@OutputCache指令将Cache-Control标头设置为Public。
如果以编程方式为页设置到期时间,则您还必须为缓存的页设置Cache-Control标头。
使用HttpCachePolicy.SetCacheability方法将HttpCacheability枚举设置为Public。
以声明方式为页设置输出缓存到期时间
∙将@ OutputCache指令包含在要将其响应存储在输出缓存中的页(.aspx文件)中。
该指令必须包括一个Duration属性(该属性具有正数字值)和一个VaryByParam属性。
下面的@OutputCache指令将页的到期时间设置为60秒。
<%@OutputCacheDuration="60"VaryByParam="None"%>
注意 当使用@OutputCache指令时,您必须包括一个VaryByParam属性,否则将发生分析器错误。
如果不想使用VaryByParam属性所提供的功能,请将其值设置为None。
有关使用VaryByParam属性的更多信息,请参见缓存页的多个版本。
以编程方式为页设置输出缓存到期时间
∙在页的代码声明块中或在该页的代码隐藏类中,通过使用Response.Cache语法将设置该页到期策略的代码包括在其中。
下面的示例设置页的到期时间,如上一个过程中@OutputCache指令所进行的操作。
∙[C#]
∙ Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
∙ Response.Cache.SetCacheability(HttpCacheability.Public);
∙ Response.Cache.SetValidUntilExpires(true);
一旦超过了缓存页的持续时间,后面对该页的请求将导致动态生成的响应。
又会在一段指定的持续时间内缓存该响应页。
页或用户控件的可缓存性定义可以在什么样的HTTP1.1Internet设备上缓存文档。
这些设备包括发出请求的客户端,响应请求的Web服务器,以及请求或响应流中任何具有缓存功能的设备(例如代理服务器)。
当Web服务器发送响应时,在它传递的所有信息中包括一个Cache-ControlHTTP标头,该标头定义可在其上缓存文档的设备。
ASP.NET在HttpCacheability枚举中定义这些值。
该枚举具有六个值,其中四个值直接映射为Cache-ControlHTTP标头设置,另外两个特殊值分别为HttpCacheability.ServerAndPrivate和HttpCacheability.ServerAndNoCache。
ServerAndPrivate只允许将响应缓存在原服务器和请求客户端上。
而ServerAndNoCache只允许将响应缓存在原服务器上。
根据应用程序的需要,您可以选择定义哪些设备可以缓存特定的页,哪些设备不能缓存特定的页。
例如,您可能希望用户登录页的可缓存性设置不同于显示产品选择的目录页。
对于登录页,出于安全方面的考虑,您可能希望只将页缓存在服务器上,而目录页可以缓存在任何支持缓存的设备上。
通过将Location属性包括在@OutputCache指令中并指定一个OutputCacheLocation枚举值,可以以声明方式设置页输出的可缓存性。
通过使用HttpCachePolicy.SetCacheability方法指定页的HttpCacheability值,您可以以编程方式设置页输出的可缓存性。
通过HttpResponse.Cache属性可以访问该方法,而使用页的代码隐藏类或代码声明块中的Response.Cache语法可以访问该属性。
注意 如果使用@OutputCache指令设置页的可缓存性,则您必须连同Location属性一起声明Duration和VaryByParam属性。
必须将Duration属性设置为大于零的值。
如果您不想使用VaryByParam属性所提供的功能,则可以将其属性设置为none。
有关更多信息,请参见设置页缓存的到期时间和缓存页的多个版本。
相比之下,如果使用HttpCachePolicy类设置可缓存性,如果已建立了验证策略,则您不需要设置到期时间。
以声明方式设置页的可缓存性
1.将@OutputCache指令包括在.aspx文件中并定义必需的Duration和VaryByParam属性。
2.将Location属性包括在@OutputCache指令中并将其值定义为受支持的值之一。
这些值包括Any、Client、Downstream、Server或None。
注意 默认值为Any。
如果未定义Location属性,则可以将页输出缓存在与响应有关的所有具有缓存功能的网络应用程序上。
其中包括请求客户端、原服务器、以及响应通过的任何代理服务器。
以编程方式设置页的可缓存性
∙在页的代码声明块或代码隐藏类文件中,使用Response.Cache语法来访问HttpCachePolicy.SetCacheability方法。
下面的代码将Cache-ControlHTTP标头设置为Public。
∙[C#]
∙ Response.Cache.SetCacheability(HttpCacheability.Public);
注意 如果将可缓存性设置为HttpCacheability.NoCache或HttpCacheability.ServerAndNoCache,则请求的客户端不会将页缓存在其“历史记录”文件夹中。
例如,用户无论何时单击向后或向前按钮,都请求响应的新版本。
通过将HttpCachePolicy.SetAllowResponseInBrowserHistory方法设置为true,可以重写此行为。
[C#]
Response.Cache.SetAllowResponseInBrowserHistory(true);
如果将可缓存性设置为NoCache或ServerAndNoCache以外的其他任何值,则ASP.NET将忽略SetAllowResponseInBrowserHistory方法所设置的值。
当输出缓存中有一个它希望用作客户端请求响应的现有项时,它必须首先检查原服务器(或含有新响应的中间缓存,如代理服务器)以确定该缓存项是否仍可用。
此过程称为验证缓存项。
为避免因在缓存项有效的情况下重新生成和重新传输页,或在缓存项无效的情况下发生额外的往返进程而导致资源浪费,ASP.NET为您提供了一种以编程方式验证缓存页的机制。
注意 有关缓存有效性及其要求的更多信息,请参见位于www.w3.orgor的HTTP1.1规范。
若要确定缓存页是否有效,必须使用与HttpCacheValidateHandler委托相同的签名定义一个事件处理程序。
该处理程序应执行检查以确定存储在缓存中的页是否仍有效,然后将HttpValidationStatus枚举值之一分配给检查的可能返回结果。
该枚举具有以下三个值:
∙Invalid,该值表示缓存页无效,并且将从缓存中移除该页,而该请求将被作为缓存未命中处理。
∙IgnoreThisRequest,该值导致请求被作为缓存未命中处理,并且将执行该页,但该缓存页是无效的。
∙Valid,该值表示缓存页仍有效。
在一个页生存期事件中,HttpCachePolicy.AddValidationCallback方法将事件处理程序作为参数获取。
从Web服务器缓存中输出响应服务之前,将查询已注册的所有处理程序以确保资源的有效性。
如果任何处理程序设置了表示资源无效的标志,则该项将标记为无效并将从缓存中移除。
然后,将请求作为缓存未命中来处理。
检查缓存页的有效性
1.定义类型HttpCacheValidateHandler的事件处理程序,该事件处理程序用于检查缓存页响应的有效性。
以下示例创建一个事件处理程序Validate,用于检查myTextTextBoxWeb服务器控件的Text属性值。
根据文本框中输入的值,Validate返回相应的HttpValidationStatus枚举值。
[C#]
publicvoidValidate(HttpContextcontext,Objectdata,refHttpValidationStatusstatus)
{
if(myText.Text=="false"){
status=HttpValidationStatus.Invalid;
}elseif(myText.Text=="ignore"){
status=HttpValidationStatus.IgnoreThisRequest;
}else{
status=HttpValidationStatus.Valid;
}
}
2.从一个页生存期事件中,调用HttpCachePolicy.AddValidationCallback方法,该操作将传递您在第1步的第一个参数变量中所定义的事件处理程序。
在以下代码示例中,Page_Load方法调用具有Validate事件处理程序(已在第1步的第一个参数变量中传递)的AddValidationCallback。
[C#]
publicvoidPage_Load(){
Response.Cache.AddValidationCallback(newHttpCacheValidateHandler(Validate),null);
}
以下示例将第1步中所定义的事件处理程序用于第2步中的代码并将时间戳写入页中。
注意 该示例旨在简单地展示如何使缓存中的页无效。
您创建的大多数方案都应该根据服务器上的某个状态(与更改的页关联)对页进行验证。
[C#]
<%@OutputCacheDuration=100varybyparam="none"%>
publicvoidPage_Load(){
if(!
IsPostback){
myText.Text="Entervalidationrequest.";
}
Response.Cache.AddValidationCallback(newHttpCacheValidateHandler(Validate),null);
stamp.InnerHtml=DateTime.Now.ToString("r");
}
publicvoidButton1_Click(){
Validate();
}
publicvoidValidate(HttpContextcontext,Objectdata,refHttpValidationStatusstatus){
if(myText.Text=="false"){
status=HttpValidationStatus.Invalid;
}elseif(myText.Text=="ignore"){
status=HttpValidationStatus.IgnoreThisRequest;
}else{
status=HttpValidationStatus.Valid;
}
}
textboxrunat="server"/>
buttonclick="Button1_Click"text="Clickheretovalidatepage."runat="server"/>
Inthetextbox,enterfalsetoinvalidatethecachedpage,ignoretoignorethecurrentrequest,oranyotherstringtoleavetheoutputcachedpagevalid.
ASP.NET 缓存(四)--使用缓存键依赖项缓存页输出
当将页添加到输出缓存后,在超过了您在到期策略中指定的时间量之后,该页将被移除。
有些时候,您要在到期之前从输出缓存中移除某个页或页的版本。
例如,如果页显示易失数据(例如股票价格或温度),如果在该页到期之前数据已被更新,则该页将显示不正确的信息。
要解决该问题,ASP.NET提供了HttpResponse.AddCacheItemDependency和HttpResponse.AddCacheItemDependencies方法,这些方法允许您缓存依赖于Cache对象(与该页所属的应用程序关联)中一项的页输出。
注意 通过调用HttpResponse.RemoveOutputCacheItem方法,可以从输出缓存中显式移除任何页。
可以从global.asax文件,从已创建的自定义ASP.NET服务器控件或从页中执行该操作,具体取决于应用程序的需要。
AddCacheItemDependency方法允许您在页和Cache中的单个项之间创建关系,而AddCacheItemDependencies方法允许您在页和Cache项的数组之间创建关系。
当该页依赖的任何项更改或从应用程序Cache中移除时,都将使页输出无效并将其从输出缓存中移除。
注意 不能从Web窗体用户控件使用这些方法。
使缓存的页输出依赖于Cache项
1.以声明方式或编程方式指定缓存页输出的设置。
有关更多信息,请参见设置页缓存的到期时间、设置页的可缓存性和缓存页的多个版本。
2.在页的代码声明块或代码隐藏文件中,使用Cache.Item属性、Cache.Add方法或Cache.Insert方法将项添加到Web应用程序的Cache对象中。
3.在页的代码声明块或代码隐藏文件中,使用Response对象语法调用AddCacheItemDependency或AddCacheItemDependencies方法,指定该页所依赖的缓存项。
警告 若要使用这些方法,传递给它的参数必须是为Cache.Item属性、Cache.Add方法或Cache.Insert方法中指定的缓存项所指定的缓存键。
下面的示例假定应用程序包含一个温度组件。
该组件使用Cache.Insert方法将温度放置在应用程序Cache中。
[C#]
Cache.Insert("Temperature.CurrentTemperature",currentTemperature);
之后,下面的页代码(在代码声明块或代码隐藏文件中)获取存储在Cache中的当前温度,将其转换为字符串,然后显示它。
然后,它使其输出缓存版本依赖于Temperature.CurrentTemperature键。
从这时起,当温度组件更新温度时,便在输出缓存中刷新页版本。
当随后请求该页时,该页将被重新放置在输出缓存中。
[C#]
inttemperature=(int)Cache.Get("Temperature.CurrentTemperature");
LabelTemperature.Text=temperature.ToString();
Response.AddCacheItemDependency("Temperature.CurrentTemperature");
ASP.NET 缓存(五)--使用文件依赖项缓存页输出
当将页添加到输出缓存后,在超过了您在到期策略中指定的时间量之后,该页将被移除。
有些时候,您要在到期之前从输出缓存中移除某个页或页的版本。
若要执行该操作,可以使用HttpResponse.AddFileDependency方法使缓存页依赖于单个文件,或者使用HttpResponse.AddFileDependencies方法使缓存页依赖于ArrayList对象所表示的文件组。
例如,如果您使用XML文件作为页的数据源,则创建一个ArrayList,它将包含页使用的所有文件的名称。
然后,可以调用AddFileDependencies使该页依赖于该ArrayList。
当任意XML文件发生更改时,该页将从输出缓存中移除,并根据下一请求生成一个新页。
注意 不能从Web窗体用户控件使用这些方法。
注意 通过调用HttpResponse.RemoveOutputCacheItem方法,可以从输出缓存中显式移除任何页。
可以从global.asax文件,从已创建的自定义ASP.NET服务器控件或从页中执行该操作,具体取决于应用程序的需要。
使缓存页输出依赖于一个文件
1.以声明方式或编程方式指定缓存页输出的设置。
有关更多信息,请参见设置页缓存的到期时间、设置页的可缓存性和缓存页的多个版本。
2.在页的代码声明块或代码隐藏文件中,创建String对象。
该对象将在AddFileDependency方法调用中作为参数变量传递。
3.在Page_Load方法或其他ASP.NET页生存期方法中,用HttpServerUtility.MapPath方法将第2步中所创建的字符串设置为依赖文件的绝对路径中。
4.在第3步所使用的同一页生存期方法中,访问Response属性语法以调用AddFileDependency方法,该操作将在filename参数中传递第2步所创建的String对象传递。
3. [C#]
4. staticstringfilePath;
6. [C#]
7. filePath=Server.MapPath("authors.xml");
9. [C#]
10. Response.AddFileDependency(filePath);
使缓存页输出依赖于文件组
1.以声明方式或编程方式指定缓存页输出的设置。
有关更多信息,请参见设置页缓存的到期时间、设置页的可缓存性和缓存页的多个版本。
2.在页的代码声明块或代码隐藏文件中,创建包含依赖文件名称的ArrayList对象。
3.在一个页生存期方法中(如Page_Load),使用Response对象语法调用AddFileDependencies方法,该操作将在filenames参数中传递第2步所创建的ArrayList对象。
3. [C#]
4. ArrayListdepAL=newArrayList();
5. depAL.Add(Server.MapPath("authors.xml"));
6. depAL.Add(Server.MapPath("products.xml"));
8. [C#]
Response.AddFileDependencies(depAL);
以下示例使用AddFileDependency方法使缓存页依赖于XML文件authors.xml。
一旦请求了该页,该页将在输出缓存中存储100秒。
不过,如果在该时间到期之前,对该XML文件进行了更改,则该页输出将从缓存中移除。
下次对该页进行请求时,输出缓存中将存储该页的新版本。
若要对其进行测试,请在请求该页后,将其他项手动添加到XML文件中,然后从浏览器刷新该页。
[C#]
<%@ImportNamespace="System.IO"%>
<%@ImportNamespace="System.Data"%>
<%@OutputCacheduration="100"varybyparam="false"%>
staticStringfilePath;
voidPage_Load(ObjectSrc,EventArgsE){
filePath=Server.MapPath("Authors.xml");
Response.AddFileDependency(filePath);
LoadData();
TimeMsg.Text=DateTime.Now.ToString("G");
}
voidLoadData(){
//ReadthedatafromtheXMLsource.
DataSetds=newDataSet();
FileStreamfs=newFileStream(Server.MapPath("authors.xml"),FileMode.Open,FileAccess.Read);
StreamReaderreader=newStreamReader(fs);
ds.ReadXml(reader);
fs.C