客户端缓存 <clientCache>

概述

<clientCache>元素的 <staticContent> 元素指定 IIS 7 及更高版本发送到 Web 客户端的与缓存相关的 HTTP 标头,这些标头控制 Web 客户端和代理服务器如何缓存 IIS 7 及更高版本返回的内容。

例如, httpExpires 属性指定内容应过期的日期和时间,IIS 7 及更高版本将向响应添加 HTTP“Expires”标头。 httpExpires 属性的值必须是符合 RFC 1123 中规范的完全格式日期和时间。 例如:

2010年01月01日 星期五 12:00:00 GMT

注意

若要使用 httpExpires 属性,需要将 cacheControlMode 属性的值设置为 UseExpires

请求注释 (RFC) 2616 中的 HTTP 1.1 规范为 HTTP“Cache-Control”标头指定了多个可能的值,例如“no-cache”、“private”、“public”等。其中每个标头值都使 Web 客户端和代理服务器知道它们是否应缓存内容:

  • 包含“no-cache”标头的内容不应由任何实体缓存。 - 包含“专用”标头的内容不应由代理服务器缓存,但可由 Web 客户端缓存。 - 包含“公共”标头的内容可由任何实体缓存。

    注意

    上面的列表并不全面 - “Cache-Control” 标头可以指定许多其他值。

可以将其他指令添加到 HTTP“Cache-Control”标头,例如“max-age”,该标头指定内容的显式过期时间。 在 IIS 7 中,“max-age”指令是通过 cacheControlMaxAge 属性配置的。 虽然“Expires”和“max-age”设置有些类似,但“max-age”指令优先于“Expires”。

注意

若要使用 cacheControlMaxAge 属性,需要将 cacheControlMode 属性的值设置为 UseMaxAge

有关 HTTP 缓存标头和日期/时间格式的详细信息,请参阅以下请求注释 (RFC) 文章:

  • RFC 1123 - “Internet 主机的要求 -- 应用程序和支持”
  • RFC 2616 - “超文本传输协议 -- HTTP/1.1”

兼容性

版本 备注
IIS 10.0 <clientCache> 在 IIS 10.0 中修改元素。
IIS 8.5 <clientCache> 在 IIS 8.5 中修改 元素。
IIS 8.0 setEtag添加了 特性以指定是否计算和设置 HTTP ETag 标头。
IIS 7.5 <clientCache> 在 IIS 7.5 中修改元素。
IIS 7.0 元素 <clientCache><staticContent> 元素是在 IIS 7.0 中引入的。
IIS 6.0 元素 <clientCache> 替换以下 IIS 6.0 元数据库属性:
  • CacheControlCustom
  • CacheControlMaxAge
  • CacheControlNoCache
  • HttpExpires

设置

元素 <clientCache><staticContent> 元素包含在 IIS 7 及更高版本的默认安装中。

操作方式

如何为网站或应用程序配置缓存过期日期

  1. (IIS) 管理器打开 Internet Information Services

    • 如果使用 Windows Server 2012 或 Windows Server 2012 R2:

      • 在任务栏上,依次单击“服务器管理器”、“工具”和“Internet Information Services (IIS) 管理器”。
    • 如果你使用的是 Windows 8 或 Windows 8.1:

      • 按住 Windows 键,按字母 X,然后单击“控制面板”。
      • 单击 “管理工具”,然后双击“ Internet Information Services (IIS) 管理器”。
    • 如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:

      • 在任务栏上,单击“ 开始”,指向 “管理工具”,然后单击“ Internet Information Services (IIS) 管理器”。
    • 如果你使用的是 Windows Vista 或 Windows 7:

      • 在任务栏上,单击“开始”,然后单击“控制面板”。
      • 双击“ 管理工具”,然后双击“ Internet Information Services (IIS) 管理器”。
  2. 在“ 连接 ”窗格中,转到要为其禁用缓存的站点、应用程序或目录。

  3. 在“ 主页 ”窗格中,双击“ HTTP 响应标头”。
    显示“默认网站主页”窗格的屏幕截图,其中选择了“HTTP 响应标头”。

  4. “HTTP 响应标头”窗格中,单击“操作”窗格中的“设置通用标头...”
    显示 I I S Manager 中的“HTTP 响应标头”窗格的屏幕截图。

  5. “设置通用 HTTP 响应标头”对话框中,检查 Web 内容过期的框,选择在特定时间间隔后或在特定时间过期的选项,然后单击“确定”。
    显示“设置常见 HTTP 响应标头”对话框的屏幕截图。已选择“启用 H T T P 保持活动状态”。
    显示“设置常见 HTTP 响应标头”对话框的屏幕截图。在“使 Web 内容过期”复选框下选中了“之后”。

如何禁用网站或应用程序的缓存

  1. (IIS) 管理器打开 Internet Information Services

    • 如果使用 Windows Server 2012 或 Windows Server 2012 R2:

      • 在任务栏上,依次单击“服务器管理器”、“工具”和“Internet Information Services (IIS) 管理器”。
    • 如果你使用的是 Windows 8 或 Windows 8.1:

      • 按住 Windows 键,按字母 X,然后单击“控制面板”。
      • 单击 “管理工具”,然后双击“ Internet Information Services (IIS) 管理器”。
    • 如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:

      • 在任务栏上,单击“ 开始”,指向 “管理工具”,然后单击“ Internet Information Services (IIS) 管理器”。
    • 如果你使用的是 Windows Vista 或 Windows 7:

      • 在任务栏上,单击“开始”,然后单击“控制面板”。
      • 双击“ 管理工具”,然后双击“ Internet Information Services (IIS) 管理器”。
  2. 在“ 连接 ”窗格中,转到要为其禁用缓存的站点、应用程序或目录。

  3. 在“ 主页 ”窗格中,双击“ HTTP 响应标头”。
    显示“默认网站主页”窗格的屏幕截图。已选择“H T T P 响应标头”。

  4. “HTTP 响应标头”窗格中,单击“操作”窗格中的“设置通用标头...”
    显示“HTTP 响应标头”窗格的屏幕截图。

  5. “设置通用 HTTP 响应标头”对话框中,检查使 Web 内容过期的框,选择“立即”,然后单击“确定”。
    显示“设置常见 HTTP 响应标头”对话框的屏幕截图。在“使 Web 内容过期”复选框下立即处于选中状态。

配置

属性

属性 说明
cacheControlCustom 可选的字符串属性。

指定自定义 HTTP 1.1 缓存控制指令。
cacheControlMaxAge 可选的 timeSpan 属性。

指定缓存控件值) 的最大期限 ((以秒为单位)。

默认值为 1.00:00:00 (1 天) 。
cacheControlMode 可选的枚举属性。

指定要用于客户端缓存的模式。

cacheControlMode 属性可以是以下可能的值之一。

默认为 NoControl
说明
NoControl 不向响应添加 Cache-Control 或 Expires 标头。

数值为 0
DisableCache 将 Cache-Control: no-cache 标头添加到响应中。

数值为 1
UseMaxAge 根据 CacheControlMaxAge 属性中指定的值向响应添加 Cache-Control: max-age=<nnn> 标头。

数值为 2
UseExpires 根据 httpExpires 属性中指定的日期向响应添加 Expires: <date> 标头。

数值为 3
httpExpires 可选的字符串属性。

指定在客户端上缓存的页面被视为过时的日期和时间。 (日期和时间根据 注释请求 1123.) HTML 文件标头中的值返回到浏览器。 用户代理将给定值与当前日期进行比较,以确定是显示缓存页还是从服务器请求更新页。
setEtag 可选布尔属性。

指定是否计算和设置 HTTP ETag 标头。 ETag 标头用于 Web 缓存验证,使 Web 服务器无需发送完整响应(如果未对内容进行更改)。 setEtag 可以在路径 system.webServer/staticContent中的配置编辑器中设置。

默认值为 true

子元素

无。

配置示例

以下配置示例将 HTTP“Cache-Control: no-cache”标头添加到响应中,从而禁用请求缓存。

<configuration>
   <system.webServer>
      <staticContent>
         <clientCache cacheControlMode="DisableCache" />
      </staticContent>
   </system.webServer>
</configuration>

以下配置示例将 HTTP“Expires: Tue, 2038 年 1 月 19 日 03:14:07 GMT”标头添加到响应,该标头将请求配置为从现在起过期几年。

<configuration>
   <system.webServer>
      <staticContent>
         <clientCache cacheControlMode="UseExpires"
            httpExpires="Tue, 19 Jan 2038 03:14:07 GMT" />
      </staticContent>
   </system.webServer>
</configuration>

代码示例

以下代码示例将 HTTP“Cache-Control: no-cache”标头添加到响应中,从而禁用请求缓存。

AppCmd.exe

appcmd.exe set config "Default Web Site" -section:system.webServer/staticContent /clientCache.cacheControlMode:"DisableCache"

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using(ServerManager serverManager = new ServerManager())
      { 
         Configuration config = serverManager.GetWebConfiguration("Default Web Site");
         ConfigurationSection staticContentSection = config.GetSection("system.webServer/staticContent");

         ConfigurationElement clientCacheElement = staticContentSection.GetChildElement("clientCache");
         clientCacheElement["cacheControlMode"] = @"DisableCache";

         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample

   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
      Dim staticContentSection As ConfigurationSection = config.GetSection("system.webServer/staticContent")

      Dim clientCacheElement As ConfigurationElement = staticContentSection.GetChildElement("clientCache")
      clientCacheElement("cacheControlMode") = "DisableCache"

      serverManager.CommitChanges()
   End Sub

End Module

Javascript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";

var staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var clientCacheElement = staticContentSection.ChildElements.Item("clientCache");
clientCacheElement.Properties.Item("cacheControlMode").Value = "DisableCache";

adminManager.CommitChanges();

VBScript

Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"

Set staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set clientCacheElement = staticContentSection.ChildElements.Item("clientCache")
clientCacheElement.Properties.Item("cacheControlMode").Value = "DisableCache"

adminManager.CommitChanges()

以下代码示例将 HTTP“Expires: Tue, 2038 年 1 月 19 日 03:14:07 GMT”标头添加到响应,该标头将请求配置为从现在起过期几年。

AppCmd.exe

appcmd.exe set config "Default Web Site" -section:system.webServer/staticContent /clientCache.cacheControlMode:"UseExpires"

appcmd.exe set config "Default Web Site" -section:system.webServer/staticContent /clientCache.httpExpires:"Tue, 19 Jan 2038 03:14:07 GMT"

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using(ServerManager serverManager = new ServerManager())
      { 
         Configuration config = serverManager.GetWebConfiguration("Default Web Site");
         ConfigurationSection staticContentSection = config.GetSection("system.webServer/staticContent");

         ConfigurationElement clientCacheElement = staticContentSection.GetChildElement("clientCache");
         clientCacheElement["cacheControlMode"] = @"UseExpires";
         clientCacheElement["httpExpires"] = @"Tue, 19 Jan 2038 03:14:07 GMT";

         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample

   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
      Dim staticContentSection As ConfigurationSection = config.GetSection("system.webServer/staticContent")

      Dim clientCacheElement As ConfigurationElement = staticContentSection.GetChildElement("clientCache")
      clientCacheElement("cacheControlMode") = "UseExpires"
      clientCacheElement("httpExpires") = "Tue, 19 Jan 2038 03:14:07 GMT"

      serverManager.CommitChanges()
   End Sub

End Module

Javascript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";

var staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var clientCacheElement = staticContentSection.ChildElements.Item("clientCache");
clientCacheElement.Properties.Item("cacheControlMode").Value = "UseExpires";
clientCacheElement.Properties.Item("httpExpires").Value = "Tue, 19 Jan 2038 03:14:07 GMT";

adminManager.CommitChanges();

VBScript

Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"

Set staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set clientCacheElement = staticContentSection.ChildElements.Item("clientCache")
clientCacheElement.Properties.Item("cacheControlMode").Value = "UseExpires"
clientCacheElement.Properties.Item("httpExpires").Value = "Tue, 19 Jan 2038 03:14:07 GMT"

adminManager.CommitChanges()