Asp.Net缓存(2)

8/10/2015来源:ASP.NET技巧人气:596

asp.net缓存(2)

缓存页的多个版本

ASP.NET 允许在输出缓存中缓存同一页的多个版本。输出缓存可能会因下列因素而异:

  • 初始请求 (HTTP GET) 中的查询字符串。
  • 回发时传递的控制值(HTTP POST 值)。
  • 随请求传递的 HTTP 标头。
  • 发出请求的浏览器的主版本号。
  • 该页中的自定义字符串。在这种情况下,可以在 Global.asax 文件中创建自定义代码以指定该页的缓存行为。

可以通过以下两种方法来缓存页输出的多个版本:

使用@ OutputCache指令的属性以声明方式

使用HttpCachePolicy类的属性和方法以编程方式。

@ OutputCache指令包括四个可用来缓存页输出的多个版本的属性:

  • VaryByParam属性可用来使缓存输出因查询字符串而异。
  • VaryByControl属性可用来使缓存输出因控制值而异。
  • VaryByHeader属性可用来使缓存输出因请求的 HTTP 标头而异。
  • VaryByCustom属性可用来使缓存输出因浏览器类型或您定义的自定义字符串而异。

注意:您必须在任何@ OutputCache指令中包括VaryByParam属性或VaryByControl属性。但是,如果您不需要使缓存输出因控制值或参数而异,则可以定义值为NoneVaryByParam

HttpCachePolicy类提供两个属性和一个方法,您可以通过它们以编程方式指定与以声明方式所能设置的缓存配置相同的缓存配置。使用VaryByParams和VaryByHeaders属性可以分别指定查询字符串参数和标头名称作为缓存策略改变依据。使用SetVaryByCustom方法可以定义要作为输出缓存改变依据的自定义字符串。

如何:使用请求浏览器缓存页的各个版本

如果您的 Web 应用程序包含一个基于请求浏览器的类型创建不同输出的页,则可以按请求该页的浏览器的主版本来缓存页输出的版本。

注意:主版本和浏览器类型信息是通过HttpBrowserCapabilities对象的MajorVersion属性在当前请求中传递的。

基于浏览器类型以声明方式缓存页的多个版本:

  1. 在 ASP.NET 页中,包括一个具有必需的Duration以及VaryByParam或VaryByControl属性的@ OutputCache指令。必须将Duration属性设置为大于零的整数。如果希望仅按浏览器类型进行缓存,请将VaryByParam属性设置为“None”。
  2. 在@ OutputCache指令中,包括VaryByCustom属性并将其设置为“browser”。

下面的示例将导致持续缓存该页达 10 秒。输出将因浏览器类型而异。

<%@ OutputCache Duration="10" VaryByParam="None"VaryByCustom="browser" %>

基于浏览器类型以编程方式缓存页的多个版本:

  1. 在页代码中,对页的Response属性的Cache属性调用SetExpires和SetCacheability方法。
  2. 调用SetVaryByCustom方法,在custom参数中传递值“browser”。

下面的代码示例演示如何持续缓存页的多个版本达 1 分钟。输出将因发出请求的浏览器的类型而异。

PRotected void Page_Load(object sender, EventArgs e){    Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d));    Response.Cache.SetCacheability(HttpCacheability.Public);    Response.Cache.SetValidUntilExpires(true);    Response.Cache.SetVaryByCustom("browser");}
View Code

如何:使用参数对页的各个版本进行缓存

有时候您希望缓存某页,但是该页可能基于查询字符串参数的值或回发中与页一起发送的值生成不同的输出

可以根据作为查询字符串值或窗体发送值发送的参数缓存页响应的多个版本。

注意

在用于缓存目的时,ASP.NET 将带相同键/值对的查询字符串值或窗体发送值视为相同,无论参数传递的顺序如何。然而,对于缓存目的,参数名是区分大小写的,ASP.NET 将为大写和小写的参数名和参数值缓存不同版本的页。

使用参数以声明方式缓存页输出的多个版本

  1. 在 ASP.NET 页中包括@ OutputCache指令,该指令带有Duration属性。Duration属性是必需的,并且必须将其设置为大于零的整数。
  2. 在@ OutputCache指令中,包括VaryByParam属性,并将其值设置为想要使页随之变化的查询字符串或窗体发送参数的名称。

下面的代码示例将页缓存 60 秒,并指定将要根据City查询字符串值或窗体发送参数缓存页输出的不同版本。

<%@ OutputCache Duration="60" VaryByParam="City" %>

注意

如果要根据多个参数改变输出缓存,请包括以分号 (;) 作为分隔符的参数名称的列表。如果要根据所有的参数值来改变缓存,请将VaryByParam属性设置为星号 (*)。下面的代码示例演示如何通过City和ZipCode参数改变页输出。

使用参数以编程方式缓存页输出的多个版本

  1. 在页的Page_Load事件中,对Response对象的Cache属性调用SetCacheability和SetExpires方法。
  2. 将参数名指定为Response对象的VaryByParams属性的变量,并将该属性设置为true

下面的代码示例演示当具有不同的Zip参数值的请求到达服务器时,如何缓存页的多个版本。

C#

Response.Cache.SetExpires(DateTime.Now.AddMinutes(1.0));

Response.Cache.SetCacheability(HttpCacheability.Public);

Response.Cache.SetValidUntilExpires(true);

Response.Cache.VaryByParams["Zip"] = true;

注意

如果要根据多个参数改变缓存的内容,请多次设置VaryByParams属性。如果要根据所有标头值改变缓存的内容,请将VaryByHeader属性设置为星号 (*)。下面的代码示例演示如何通过City和Zip参数改变页输出。

如何:使用 HTTP 标头对某页的各个版本进行缓存

使用 ASP.NET,您可以根据指定的 HTTP 标头的值对某页的多个版本进行缓存。当请求页时,您可以指定按传递到应用程序的单个标头、多个标头或所有标头进行缓存。

根据 HTTP 标头值以声明方式对某页的各个版本进行缓存

  1. 在 ASP.NET 页中,在@ OutputCache指令中包括必需的Duration和VaryByParam或VaryByControl属性。必须将Duration属性设置为大于零的整数。如果希望只按 HTTP 标头值进行缓存,则必须将VaryByParam属性设置为“None”。
  2. 在@ OutputCache指令中,包含VaryByHeader属性,将其值设置为要作为改变缓存内容的依据的 HTTP 标头的名称。

下面的示例将页缓存 60 秒,并根据随Accept-LanguageHTTP 标头传递的值设置要缓存的页的版本:

<%@ OutputCache Duration="60" VaryByParam="None" aryByHeader="Accept-Language" %>

注意:如果要根据多个标头改变缓存的内容,请以分号 (;) 作为分隔符包括标头名称的列表。如果要根据所有标头值改变缓存的内容,请将VaryByHeader属性设置为星号 (*)。

根据 HTTP 标头值以编程方式对某页的各个版本进行缓存

  1. 在页的Page_Load方法中,对页的Response对象的Cache属性调用SetCacheability和SetExpires方法。
  2. 将VaryByHeaders属性中的 HTTP 标头值设置为true

下面的代码示例演示如何为有不同的Accept-LanguageHTTP 标头值的请求,将某页的多个版本缓存一分钟之久。

protected void Page_Load(object sender, EventArgs e){    Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d));    Response.Cache.SetCacheability(HttpCacheability.Public);    Response.Cache.SetValidUntilExpires(true);    Response.Cache.VaryByHeaders["Accept-Language"] = true;}
View Code

注意:如果要根据多个标头改变缓存的内容,需要在VaryByHeaders属性中设置多个值。如果要根据所有标头改变缓存的内容,请将VaryByHeaders["VaryByUnspecifiedParameters"] 设置为true

如何:使用自定义字符串对页的各个版本进行缓存

除了按浏览器类型和参数进行不同的输出缓存行为外,还可以根据您定义的方法所返回的不同字符串对页输出的多个版本进行缓存。

根据自定义字符串对页进行缓存时,应首先指定要使用的自定义字符串的标识符。然后在应用程序的 Global.asax 文件中创建一个方法,该方法接受此标识符,并且返回一个值,作为进行不同的输出缓存行为的依据。

根据自定义字符串对页输出的多个版本进行缓存

  1. 在 ASP.NET 页中包括@ OutputCache指令,该指令带有必需的Duration和VaryByParam属性。必须将Duration属性设置为大于零的整数。如果不想使用VaryByParam属性提供的功能,则必须将其值设置为“无”。
  2. 若要以声明方式设置自定义字符串,请在@ OutputCache指令中包括VaryByCustom属性,并将该属性设置为您要作为进行不同输出缓存行为的依据的字符串。

下面的指令根据自定义字符串“minorversion”改变页输出。

<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="minorversion" %>

  1. 若要以编程方式设置自定义字符串,请调用SetVaryByCustom方法,并将要使用的自定义字符串传递给它。

下面的代码示例演示如何将自定义字符串设置为“minorversion”。

C#

Response.Cache.SetVaryByCustom("minorversion");

注意

如果试图以编程方式和声明方式设置自定义字符串,则会收到InvalidOperationException。您需要选择其中一种方法。

  1. 在应用程序的 Global.asax 文件中,重写GetVaryByCustomString方法以指定自定义字符串的输出缓存行为。

被重写的方法接受您在VaryByCustom属性或SetVaryByCustom方法中设置的字符串,作为它的arg参数。例如,有些页可能根据请求浏览器的次版本进行缓存。对于这些页,可以将VaryByCustom属性设置为“minorversion”。然后,在被重写的GetVaryByCustomString方法中,可以检查arg参数,并根据arg参数的值是否为“minorversion”返回不同的字符串。

下面的代码示例演示一个 Global.asax 文件,其中的GetVaryByCustomString方法