Asp.Net缓存(2)

缓存页的多个版本

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

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

能够经过如下两种方法来缓存页输出的多个版本:sql

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

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

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

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

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

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

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

若是您的 Web 应用程序包含一个基于请求浏览器的类型建立不一样输出的页,则能够按请求该页的浏览器的主版原本缓存页输出的版本。网络

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

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

  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 缓存依赖项的每一个页中引用该缓存配置文件。