ASP.NET 缓存,七--根据参数缓存页的版本

如果您使用 GET 和 POST HTTP 方法从用户收集信息,根据用户的输入的不同,它们可以生成不同的响应。带有查询字符串的 GET 请求和 POST 请求与用来从用户收集信息的 HTML 窗体关联。根据这些参数,您可以缓存页响应的多个版本。要完成该操作,您可以使用@ OutputCache 指令的 VaryByParam 属性或 HttpCachePolicy.VaryByParams 属性。

根据查询字符串或窗体 POST 参数以声明方式缓存页输出的多个版本

  1. @OutputCache 指令包括在您要缓存的 .aspx 文件中。一定要将必需的 Duration 属性设置为大于零的值。
  2. 使用 VaryByParam 属性设置根据其改变页的查询字符串或窗体 POST 参数。将下面的示例包括在 .aspx 文件的顶部会为每个到达的具有不同 City 参数值的请求缓存不同版本的页输出。
    <%@ OutputCache duration="60" varybyparam="City" %>
    注意 如果要通过多个参数改变输出缓存,则使用分号分隔的列表在 VaryByParam 属性中定义它们。如果要根据所有的参数值来改变缓存,请将该属性设置为星号 (*)。

根据查询字符串或窗体 POST 参数以编程方式缓存页输出的多个版本

  1. 在该页的代码声明块或代码隐藏类中,使用 Response.Cache 语法为已缓存的页面内容设置到期和可见性策略。您可以分别使用 HttpCachePolicy.SetExpiresHttpCachePolicy.SetCacheability 方法来完成此任务。
  2. 在相同的代码中,将参数名指定为 VaryByParams 属性的参数,并将该属性设置为 true。当具有不同 City 参数值的请求到达服务器时,下面的代码缓存页的多个版本。
    [C#]
        Response.Cache.VaryByParams["City"] = true;
        [Visual Basic]
        Response.Cache.VaryByParams("City") = true
    注意 如果要通过多个参数改变输出缓存,则使用分号分隔的列表将它们包括在 VaryByParams 参数中。如果要根据所有的参数值来改变缓存,请将该属性设置为星号 (*)。
    下面的示例演示根据 CityZipCode 参数改变页输出。
    [C#]
        Response.Cache.VaryByParams["City;ZipCode"] = true;
        [Visual Basic]
        Response.Cache.VaryByParams("City;ZipCode") = true

下面的讨论详细说明如何根据具有不同值的传入请求来缓存页的版本,这些传入请求中的值是在窗体 POST 或查询字符串参数中传递的。

您的应用程序包含一个 .aspx 文件 (Mycache.aspx),并且指定应该根据 city 参数缓存页的不同版本。到达了四个带有查询字符串的请求:两个带有 count 参数,四个带有 city 参数。

http://www.microsoft.com/caching/mycache.aspx?count=10&city=dallas
http://www.microsoft.com/caching/mycache.aspx?count=10&city=newyork
http://www.microsoft.com/caching/mycache.aspx?city=dallas
http://www.microsoft.com/caching/mycache.aspx?city=seattle

因为您指示输出缓存只根据 city 参数进行改变,所以缓存页输出的三个版本,一个用于 dallas,一个用于 newyork,一个用于 seattle。第一个请求(包含 dallas 参数值)导致缓存页输出的一个版本,而第三个请求(也具有一个 dallas 参数值)从输出缓存中获得页的该版本。在这些版本保留在缓存的这段时间中,将从输出缓存满足包含 city 参数,参数值为 dallasnew yorkseattle 的请求。

如果要根据 citycount 两个参数来改变输出缓存,则缓存该页的四个版本。出现这种情况是因为第一项包含 count 查询字符串参数,而第三项却不包含。如果根据所有可能的参数改变缓存,则将为每个具有唯一参数值的请求创建输出缓存项。在当前示例中,这也是缓存页的四个版本的原因。

注意 只要页的缓存版本未到期,就将用它来满足具有相同键/值对的 GET 查询字符串或 POST 参数,而与这些参数传递的顺序无关。由于 GET 查询字符串和窗体 POST 参数区分大小写,因此如果参数值大小写不一致,则 ASP.NET 会将该参数视为与原缓存项不同,并将页的另一个版本输入输出缓存中。