Asp.Net缓存(2)

缓存页的多个版本

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

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

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

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

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

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

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

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

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-Language HTTP 标头传递的值设置要缓存的页的版本:

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

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

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

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

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

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 方法被重写。

<%@ Application language="C#" %>

<script runat="server">

public override string GetVaryByCustomString(HttpContext context,

    string arg)

{

    if(arg == "minorversion")

    {

        return "Version=" +

            context.Request.Browser.MinorVersion.ToString();

    }

    return base.GetVaryByCustomString(context, arg);

}

</script>

View Code

缓存 ASP.NET 页的某些部分

执行此操作有两个选项:控件缓存和缓存后替换。

在控件缓存(也称为片段缓存)中,可以通过创建用户控件来包含缓存的内容,然后将用户控件标记为可缓存来缓存部分页输出。该选项允许缓存页中的特定内容,而在每次都重新创建整个页。例如,如果创建的页显示大量动态内容(如股票信息),但也有某些部分是静态的(如每周摘要),则可以在用户控件中创建这些静态部分并将用户控件配置为缓存。

 

缓存后替换与控件缓存正好相反。它对页进行缓存,但是页中的某些片段是动态的,因此不会缓存这些片段。例如,如果创建的页在设定的时间段内完全是静态的(例如新闻报道页),可以设置为缓存整个页。如果为缓存的页添加旋转广告横幅,则在页请求之间,广告横幅不会变化。然而,使用缓存后替换,可以对页进行缓存,但可以将特定部分标记为不可缓存。在本例中,将广告横幅标记为不可缓存。它们将在每次页请求时动态创建,并添加到缓存的页输出中。

控件缓存

通过创建用户控件来缓存内容,可以将页上需要花费宝贵的处理器时间来创建的某些部分(例如数据库查询)与页的其他部分分离开。只需占用很少服务器资源的部分可以在每次请求时动态生成。

在标识了要缓存的页的部分,并创建了用以包含这些部分中的每个部分的用户控件后,您必须确定这些用户控件的缓存策略。您可以使用 @ OutputCache 指令,或者在代码中使用PartialCachingAttribute 类,以声明的方式为用户控件设置这些策略。

例如,如果在用户控件文件(.ascx 文件)的顶部包括下面的指令,则该控件的一个版本将在输出缓存中存储 120 秒。

<%@ OutputCache Duration="120" VaryByParam="None" %>

若要在代码中设置缓存参数,可以在用户控件的类声明中使用一个属性。例如,如果在类声明的元数据中包括下面的属性,则该内容的一个版本将在输出缓存中存储 120 秒:

[PartialCaching(120)]

public partial class CachedControl : System.Web.UI.UserControl{    // Class Code}

注意:由于可在页上嵌套用户控件,您还可以嵌套已放置到输出缓存中的用户控件。可以为页和嵌套的用户控件指定不同的缓存设置

以编程方式引用缓存的用户控件

在以声明的方式创建可缓存的用户控件时,可以包括一个 ID 属性,以便以编程方式引用该用户控件实例。但是,在代码中引用用户控件之前,必须验证在输出缓存中是否存在该用户控件。缓存的用户控件只在首次请求时动态生成;在指定的时间到期之前,从输出缓存满足所有的后续请求。确定用户控件已实例化后,可以从包含页以编程方式操作该用户控件。例如,如果通过声明方式将 SampleUserControl 的 ID 分配给用户控件,则可以使用下面的代码检查它是否存在。

protected void Page_Load(object sender, EventArgs e)

{    if (SampleUserControl != null)// Place code manipulating SampleUserControl here.}

以不同的持续时间缓存页和用户控件

可以为页和页上的用户控件设置不同的输出缓存持续时间值。如果页的输出缓存持续时间长于用户控件的输出缓存持续时间,则页的输出缓存持续时间优先。例如,如果页的输出缓存设置为 100 秒,而用户控件的输出缓存设置为 50 秒,则包括用户控件在内的整个页将在输出缓存中存储 100 秒,而与用户控件较短的时间设置无关。

下面的代码示例演示了当页的缓存持续时间长于用户控件的缓存持续时间时的效果。该页配置为缓存 100 秒。

<%@ Page language="C#" %>

<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>

<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); Response.Write(t); %>

下面的代码示例演示了包括在页中的用户控件。控件的缓存持续时间设置为 50 秒。

<% @Control language="C#" %>

<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString();

    Response.Write(t); %>

不过,如果页的输出缓存持续时间比用户控件的输出缓存持续时间短,则即使已为某个请求重新生成该页的其余部分,也将一直缓存用户控件直到其持续时间到期为止。例如,如果页的输出缓存设置为 50 秒,而用户控件的输出缓存设置为 100 秒,则页的其余部分每到期两次,用户控件才到期一次。

下面的代码演示了一个页的标记,该页中包含的用户控件的缓存持续时间长于该页的缓存持续时间。该页配置为缓存 50 秒。

<%@ Page language="C#" %>

<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>

<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>

 <% DateTime t = DateTime.Now.ToString();

    Response.Write(t); %>

下面的代码演示了包括在页中的用户控件。控件的缓存持续时间设置为 100 秒。

C#

<% @Control language="C#" %>

<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); Response.Write(t); %>

 

缓存用户控件输出的多个版本

就像可以改变已进行输出缓存的页的版本一样,您可以输出缓存具有用户控件的页的区域。 

通过根据控件的名称和 GET 查询字符串或窗体 POST 参数值,或只根据参数值改变用户控件输出,您可以完成该操作。 通过在它所包含的 .aspx 文件中对用户控件进行多次声明,您也可以缓存页上用户控件的多个版本。 您可以使用这些技术中的任何一个,无论是在 .ascx 文件中使用 @ OutputCache 指令指定用户控件的输出缓存,还是在代码隐藏类中开发用户控件时使用PartialCachingAttribute 特性。

用户控件的 @ OutputCache 指令支持四种特性:VaryByParam、VaryByCustom、VaryByControl 和 Shared。 PartialCachingAttribute类包括四种属性:VaryByParams、VaryByControls、VaryByCustom 和 Shared,使用这些属性,您可以通过向代码隐藏类中的用户控件添加特性使用相同技术。

当首次对包含具有输出缓存设置的用户控件的 ASP.NET 页进行请求时,控件输出的实例将保存到内存中。 默认情况下,包含同一用户控件的每一页都将会在请求该页时将控件输出的另一个实例添加到内存中。

例如,如果创建了一个具有输出缓存设置的用户控件 Sample.ascx,并将 Sample.ascx 添加到了应用程序的 25 个 ASP.NET 页中,则输出缓存中至少会存储 25 个 Sample.ascx 版本。 另外,如果使用 VaryByControl、VaryByCustom 或 VaryByParam 特性修改用户控件的缓存行为,则缓存中将会有更多的用户控件输出版本。 例如,假定您将 TextBox Web 服务器控件包含在用户控件中,并将其 ID 属性设置为 MyTextBox。 如果将 VaryByControl 特性设置为MyTextBox,则对于 MyTextBox 控件接收到的每个值,都将会有一个用户控件输出版本存储在缓存中。

如果在同一应用程序的多个页中使用了相同的用户控件,则可以通过以下方法来节省内存:将用户控件的 @ OutputCache 指令的 Shared 特性设置为 true,或将控件的PartialCachingAttribute 特性的 Shared 属性设置为 true。 这意味着每个页都将访问用户控件输出的同一实例。 对于经常使用和频繁缓存的用户控件,使用 Shared 属性可以节省大量的内存。

将用户控件输出添加到输出缓存中和对页输出进行相同的操作这两者存在一个主要区别。 尽管两者的输出缓存都支持使用 GET 查询字符串和窗体 POST 参数创建和缓存输出的多个版本,但用户控件不支持基于 HTTP 标头的缓存。

您可以使用以下四种技术来改变输出缓存的用户控件:

  • 可以使用 VaryByParam 特性或 PartialCachingAttribute 类的 VaryByParams 属性,它们提供的功能与为页输出缓存所提供的相同。 可以将这两种属性的任意一种设置为任何字符串,但需要将其等同于与所创建用户控件关联的 GET 查询字符串或格式 POST 参数。
  • 可以使用 VaryByControl 特性或 PartialCachingAttribute 类的 VaryByControls 属性 (Propery),根据用户控件所包含的 ASP.NET 服务器控件的 ID 属性 (Propery) 来改变输出缓存用户控件。
  • 可以使用 VaryByCustom 特性或 PartialCachingAttribute 类的 VaryByCustom 属性,为您想要用来改变缓存的用户控件输出的自定义字符串定义代码。 此方法的工作方式与改变页输出缓存的 VaryByControl 特性方法相同。 
  • 可以在 ASP.NET 页中包含用户控件的多个实例。 除非将 @ OutputCache 指令的Shared 特性设置为 true,否则将为控件的每个实例的输出进行缓存。

如何:根据参数缓存用户控件的多个版本

  • 指定用户控件名称以及一个查询字符串或窗体 POST 参数。 可以通过使用 @ OutputCache 指令的 VaryByParam 特性以声明方式进行该指定。 或者,可以通过设置用户控件代码中的 PartialCachingAttribute 的 VaryByParams 属性以编程方式达进行该指定。
  • 指定用户控件中包含的 ASP.NET 服务器控件的 ID 属性。 可以使用 VaryByControl 特性以声明方式执行该指定。 或者,可以通过设置 PartialCachingAttribute 中的 VaryByControls 属性以编程方式进行该指定。

注意:仅当用户控件回发并自行处理回发时,根据查询字符串或窗体 POST 参数将用户控件输出改变到缓存才有效。 如果用户控件回发到包含页,则该类型的用户控件输出缓存将不能正常工作。

通过使用 VaryByControl 特性以声明方式缓存用户控件的多个版本

  1. 创建回发的用户控件。
  2. 在用户控件中,包括一个带有 Duration 和 VaryByControl 特性的 @ OutputCache 指令。

注意

如果在指令中使用 VaryByControl 特性,则不需要同时包括 VaryByParam 特性,虽然您也可以包括后者并将其设置为“None”。

  1. 将 VaryByControl 特性设置为希望用户控件输出改变所依据的控件的 ID。

例如,下面的 @ OutputCache 指令将用户控件的过期时间设置为 60 秒,并通过 ID 为 State 的 ASP.NET 服务器控件来改变控件输出:

<%@ OutputCache Duration="60" VaryByControl="State" %>

通过使用 VaryByControls 属性以编程方式缓存用户控件的多个版本

  1. 在代码中,创建向自身回发的用户控件代码。
  2. 在用户控件代码的开头包括一个 PartialCachingAttribute。
  3. 包括 Duration 参数的值,并将 VaryByControls 参数设置为希望用户控件输出改变所依据的用户控件中 ASP.NET 服务器控件的 ID 属性值。

下面的代码示例将 Duration 设置为 60 秒并将 VaryByControls 设置为 State。 该代码应包括在扩展 UserControl 类的代码之前。

 [PartialCaching(60, null, State, null)]

通过使用 VaryByParam 特性以声明方式缓存用户控件的多个版本

  1. 创建向自身回发的用户控件。
  2. 在用户控件中,包括一个带有 Duration 和 VaryByParam 特性的 @ OutputCache 指令。

注意

如果将 VaryByControl 特性包括在用户控件的 @ OutputCache 指令中,则不需要同时包括 VaryByParam 特性。

  1. 将 VaryByParam 特性设置为希望用户控件改变所依据的 GET 查询字符串或窗体 POST 参数。

例如,下面的 @ OutputCache 指令将用户控件的过期时间设置为 60 秒,并通过名为 State 的窗体 POST 参数或查询字符串参数的值来改变控件的输出。

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

通过使用 VaryByParams 属性以编程方式缓存用户控件的多个版本

  1. 在代码中,创建向自身回发的用户控件代码。
  2. 在用户控件代码的开头包括一个 PartialCachingAttribute。
  3. 包括 Duration 参数的值,并将 VaryByParams 参数设置为希望用户控件改变所依据的 GET 查询字符串或窗体 POST 参数。

下面的代码示例将 Duration 设置为 60 秒,并将 VaryByParams 设置为名为 State 的窗体 POST 参数或查询字符串参数。 该代码应包括在扩展 UserControl 类的代码之前。

 [PartialCaching(60, State, null, null)]

如何:使用声明性的特性缓存用户控件的多个版本

只需在 .aspx 文件中多次声明某个用户控件便可以缓存该用户控件的多个版本。 同未进行缓存的用户控件一样,可以根据应用程序的需要将一个缓存的用户控件多次包含在 ASP.NET 页中。 除非将用户控件的 Shared 属性设置为 true,否则控件输出的多个版本都将存储在缓存中。

通过使用声明性的特性缓存用户控件的多个版本

  1. 通过在 .ascx 文件中使用 @ OutputCache 指令或在代码隐藏类中使用 PartialCachingAttribute 属性,指定用户控件的输出缓存设置。

下面的 @ OutputCache 声明将对控件进行 120 秒钟的缓存:

<%@ OutputCache Duration="120" VaryByParam="None" %>

  1. 在页中包括用户控件的多个版本,将在类中定义的属性作为特性包括在元素中。 确保属性值在页上是唯一的。

只需在 .ascx 文件中包含持续时间值有效的 @ OutputCache 指令或在代码隐藏类中设置 PartialCachingAttribute,即可获得用户控件的不同缓冲输出。

动态更新缓存页的部分

对页面进行缓存可以大大提高 Web 应用程序的性能。 不过,在有些情况下,需要缓存页面的大部分内容,但页面中的某些片段是动态的。 例如,如果创建一个页面,其中的新闻故事在设定时间段内完全是静态的,则可以设置为缓存整个页面。 如果希望提供在每次页请求时都发生变化的交替出现的广告横幅,则该页中包含该广告的部分需要是动态的。

若要允许缓存某个页面但动态地替换其中的某些内容,可以使用 ASP.NET 缓存后替换。 通过使用缓存后替换,将对整个页面进行输出缓存,并将特定的部分标记为不进行缓存。 在广告横幅示例中,AdRotator 控件使您可以利用缓存后替换功能,以便为每个用户及在每次刷新页时动态创建广告。

有三种方法可以实现缓存后替换:

  • 以声明方式使用 Substitution 控件。
  • 以编程方式使用 Substitution 控件 API。
  • 以隐式方式使用 AdRotator 控件。

Substitution 控件

ASP.NET Substitution 控件指定缓存页中动态创建而不进行缓存的部分。 将 Substitution 控件放置在该页上要显示动态内容的位置。

在运行时,Substitution 控件调用使用 MethodName 属性指定的方法。 该方法必须返回一个字符串,然后该字符串替换Substitution 控件的内容。 该方法必须是 Page 或 UserControl 包含控件上的静态方法。

使用 Substitution 控件可以将客户端可缓存性更改为服务器可缓存性,以便该页面不会在客户端上进行缓存。 这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。

Substitution API

若要以编程方式为缓存页创建动态内容,可以在页代码中将某个方法的名称作为参数传递给 WriteSubstitution 方法来调用该方法。 该方法处理动态内容的创建,它采用单个 HttpContext 参数并返回一个字符串。 该返回字符串是将在给定位置被替换的内容。 通过调用 WriteSubstitution 方法来代替以声明方式使用 Substitution 控件的一个好处是可以调用任意对象的方法,而不只是调用 Page 或 UserControl 对象的静态方法。

调用 WriteSubstitution 方法可以将客户端可缓存性更改为服务器可缓存性,以便该页不会在客户端上进行缓存。 这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。

AdRotator 控件

AdRotator 服务器控件在内部实现对缓存后替换的支持。 如果将 AdRotator 控件放在页面上,则无论是否缓存父页,都将在每次请求时呈现其特有的广告。 因此,包含 AdRotator 控件的页面只在服务器端进行缓存。

#begin //网上查找

//这种方式是使用的substitution控件的基本方法

<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentDateTime" />
//下面这种方式是调用substitution的API的方式(substitution的API包括一个关键的WriteSubstitution方法,该方法来自于HttpResponse类     <% Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetCurrentDateTime)); %>//,其语法代码如下所示:)
 public void WriteSubstitution(HttpResponseSubstitutionCallback callback)  {  }

//这个委托定义的方法有两个特征:1:返回值必须是string;2:参数有且仅有一个,并且是HttpContext类型

public delegate string HttpResponseSubstitutionCallback (HttpContext context)

#end

使用 SqlCacheDependency 类在 ASP.NET 中缓存

ASP.NET 允许您使用 SqlCacheDependency 类创建依赖于数据库中表或行的缓存项。 当表中或特定行中发生更改时,带有依赖项的项便会失效,并会从缓存中移除。 可以在 Microsoft SQL Server 7.0、SQL Server 2000 和 SQL Server 2005 中设置表的依赖项。 如果您使用 SQL Server 2005,还可以设置特定记录的依赖项。

在某些方案中,使用带有 SQL 依赖项的缓存可显著提高应用程序的性能。 例如,假定您正在构建一个从数据库显示产品信息的电子商务应用程序。 如果不进行缓存,则每当用户要查看产品时,应用程序都必须从数据库请求数据。 您可以在某一时刻将产品信息缓存一天,由于产品信息已经在内存中,因此可确保较快的响应时间, 但是,当产品信息发生变化时,缓存的产品信息就会失去与数据库中数据的同步,且不同步的时间最长可达一天。

使用 SQL 缓存依赖项可以缓存产品信息,并创建一个数据库表或行更改的依赖项。 当且仅当数据更改时,基于该数据的缓存项便会失效并会从缓存中移除。 下次从缓存中请求该项时,如果该项不在缓存中,便可以再次向缓存中添加更新后的版本,并且可确保具有最新的数据。

SQL 缓存依赖项还可用于页输出缓存。 例如,可以创建一个名为 ViewProduct.aspx 的页,用于显示有关特定产品的信息。 可以将该页的缓存策略设置为 SQL 依赖项,就如为手动添加到缓存中的项所设置的依赖项一样。 该页便会一直存储在缓存中,直至所依赖的表或行发生更改为止。 当数据发生更改时,便会重新创建页,并将新创建的页再次存储在输出缓存中。

ASP.NET SQL 缓存依赖项提供以下功能:

  • SQL 缓存依赖项可用于应用程序缓存和页输出缓存。
  • 可在 SQL Server 7.0 及更高版本中使用 SQL 缓存依赖项。
  • 可以在网络园(一台服务器上存在多个处理器)或网络场(多台服务器运行同一应用程序)中使用 SQL 缓存依赖项。
  • 与 SQL 缓存依赖项关联的数据库操作比较简单,因此不会给服务器带来很高的处理成本。
  • 在应用程序和 SQL Server 中配置 SQL 缓存依赖项不需要很精深的 SQL 知识。 ASP.NET 中包括可以自动执行此配置的工具。 另外,还可以使用 SqlCacheDependencyAdmin 类以编程方式配置 SQL 缓存依赖项。

SQL Server 7.0 和 SQL Server 2000 实现

ASP.NET 为 SQL Server 7.0 和 SQL Server 2000 的缓存依赖项实现了一个轮询模型。 ASP.NET 进程内的一个线程会以指定的时间间隔轮询 SQL Server 数据库,以确定数据是否已更改。 如果数据已更改,缓存依赖项便会失效,并从缓存中移除。 可以在 Web.config 文件中以声明方式指定应用程序中的轮询间隔,也可以使用 SqlCacheDependency 类以编程方式指定此间隔。

对于 SQL Server 7.0 和 SQL Server 2000,SQL 缓存依赖项仅限于表级别的数据更改。 可以将 ASP.NET 配置为轮询数据库来确定表中的更改,但不能确定特定行中的更改。

启用 SQL 缓存

为了在 SQL Server 7.0 和 SQL Server 2000 中使用 SQL 缓存依赖项,必须先将 SQL Server 配置为支持缓存依赖项。 ASP.NET 提供了一些实用工具,可用于配置 SQL Server 上的 SQL 缓存,其中包括一个名为 Aspnet_regsql.exe 的工具和SqlCacheDependencyAdmin 类。 有关如何在 SQL Server 上启用 SQL 缓存依赖项的更多信息,请参见如何:使用缓存键依赖项缓存页输出

SQL Server 2005 实现

SQL Server 2005 为缓存依赖项实现的模型不同于 SQL Server 7.0 和 SQL Server 2000 中的缓存依赖项模型。 在 SQL Server 2005 中,不需要执行任何特殊的配置步骤来启用 SQL 缓存依赖项。 此外,SQL Server 2005 还实现了一种更改通知模型,可以向订阅了通知的应用程序服务器发送通知,而不是依赖早期版本的 SQL Server 中必需的轮询模型。

SQL Server 2005 缓存依赖项在接收通知的更改类型方面更具灵活性。 SQL Server 2005 监控对特定 SQL 命令的结果集的更改。如果数据库中发生了将修改该命令的结果集的更改,依赖项便会使缓存的项失效。 此功能使得 SQL Server 2005 可以提供行级别的通知。

对用于测试更改的查询有一些要求。 必须提供完全限定的表名,其中包括所有者名称(例如 dbo.authors)。 总之,SQL 2005 通知支持 Select 查询和存储过程,支持多个查询和嵌套查询,但不支持聚合操作(例如 COUNT(*))。 有关 SQL Server 2005 支持哪些查询以及通知规则的更多信息,请参见“SQL Books Online”(SQL 联机丛书)中的主题“Creating a Query for Notification”(创建通知查询)。

在 ASP.NET 应用程序中配置 SQL 缓存

在对 SQL Server 7.0 或 SQL Server 2000 进行了缓存依赖项配置后,或是在 SQL Server 2005 中创建了适当的命令依赖项后,就可以配置您的应用程序来使用 SQL 缓存依赖项,如同配置任何其他缓存依赖项一样。 例如,可以在 Web.config 文件中创建一个缓存配置文件,然后在应使用 SQL 缓存依赖项的每个页中引用该缓存配置文件。 

posted @ 2014-04-16 17:33  anlien  阅读(318)  评论(0编辑  收藏  举报