ASP.NET 缓存,八--根据 HTTP 标头缓存页的版本

@ OutputCache 指令的 VaryByHeader 属性和 HttpCachePolicy.VaryByHeaders 属性允许根据您指定的 HTTP 标头的值缓存页的多个版本。当请求页时,您可以指定传递到应用程序的单个标头、多个标头或所有标头。根据您选择的标头或标头组合,将缓存页输出的多个版本。

根据 HTTP 标头值以声明方式缓存页的版本

  1. 包括带有必需的 DurationVaryByParam 属性的 @OutputCache 指令。必须将 Duration 属性设置为大于零的任意整数。如果不想使用 VaryByParam 属性提供的功能,请将其值设置为 None
  2. VaryByHeader 属性包括在 @ OutputCache 指令体中,将其值设置为要根据其改变缓存内容的 HTTP 标头的名称。下面的示例根据与 Accept-Language HTTP 标头一起传递的值设置要缓存的页的版本。
    <%@ OutputCache Duration="60" VaryByParam="None" VaryByHeader="Accept-Language" %>
    注意 如果要根据多个标头改变缓存的内容,则包括一个以分号分隔的标头名称的列表。如果要根据所有标头值改变缓存的内容,则将 VaryByHeader 属性设置为等于星号 (*)。

根据 HTTP 标头值以编程方式缓存页的版本

  1. 在该页的代码声明块或代码隐藏类中,使用 Response.Cache 语法为已缓存的页面内容设置到期和可见性策略。您可以分别使用 HttpCachePolicy.SetExpiresHttpCachePolicy.SetCacheability 方法来完成此任务。
  2. 在相同的代码中,将标头名称指定为 VaryByHeaders 属性的参数,并将属性设置为 true。当请求到达服务器时,下面的代码缓存页(其 Accept-Language HTTP 标头分配有不同的值)的多个版本。
    [C#]
        Response.Cache.VaryByHeaders["Accept-Language"] = true;
        [Visual Basic]
        Response.Cache.VaryByHeaders("Accept-Language") = true
    注意 如果要根据多个标头值改变缓存,则将 VaryByHeaders 属性参数设置为以分号分隔的有效 HTTP 标头名的列表。如果要根据所有 HTTP 标头名改变缓存中的页,请使用 VaryByUnspecifiedParameters 方法。

下面的讨论假设通过使用本主题内一个过程中的代码对页的输出进行缓存。

到达了四个对该页的请求,分别具有以下的 Accept-Language 标头。

de-lu
en-us
fr
en-us

因为第二个和第四个请求具有相同的 Accept-Language HTTP 标头值,所以只为首次请求缓存生成的响应。另外两个 Accept-Language 值生成的页输出版本也被缓存。为这四个请求总共呈现并缓存三个文档。在缓存的页到期之前,将从输出缓存满足任何对该页具有相同的 Accept-Language 值的请求。该示例演示如何根据请求浏览器的区域设置缓存全局化内容的页输出。