ASP.NET Core MVC 中的缓存标记帮助程序Cache Tag Helper in ASP.NET Core MVC

本文内容

作者:Peter Kellner

缓存标记帮助程序通过将其内容缓存到内部 ASP.NET Core 缓存提供程序中,极大地提高了 ASP.NET Core 应用的性能。

有关标记帮助程序的概述,请参阅 ASP.NET Core 中的标记帮助程序

以下 Razor 标记缓存当前日期:

  1. <cache>@DateTime.Now</cache>

对包含标记帮助程序的页面的第一个请求显示当前日期。其他请求将显示已缓存的值,直到缓存过期(默认 20 分钟)或因内存压力而逐出。

缓存标记帮助程序属性Cache Tag Helper Attributes

已启用enabled

属性类型示例默认
Booleantruefalsetrue

enabled 确定是否缓存了缓存标记帮助程序所包含的内容。默认为 true如果设置为 false,则不会缓存呈现的输出。

示例:

  1. <cache enabled="true">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

expires-onexpires-on

属性类型示例
DateTimeOffset@new DateTime(2025,1,29,17,02,0)

expires-on 为缓存项设置一个绝对到期日期。

以下示例将在 2025 年 1 月 29 日下午 5:02 之前缓存缓存标记帮助程序的内容:

  1. <cache expires-on="@new DateTime(2025,1,29,17,02,0)">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

expires-afterexpires-after

属性类型示例默认
TimeSpan@TimeSpan.FromSeconds(120)20 分钟

expires-after 设置从第一个请求时间到缓存内容的时间长度。

示例:

  1. <cache expires-after="@TimeSpan.FromSeconds(120)">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

Razor 视图引擎将默认的 expires-after 值设置为 20 分钟。

expires-slidingexpires-sliding

属性类型示例
TimeSpan@TimeSpan.FromSeconds(60)

设置某个缓存项的值未被访问时,该缓存项应被逐出的时间。

示例:

  1. <cache expires-sliding="@TimeSpan.FromSeconds(60)">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

vary-by-headervary-by-header

属性类型示例
StringUser-AgentUser-Agent,content-encoding

vary-by-header 接受逗号分隔的标头值列表,在标头值发生更改时触发缓存刷新。

以下示例监视标头值 User-Agent该示例将缓存提供给 Web 服务器的每个不同 User-Agent 的内容:

  1. <cache vary-by-header="User-Agent">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

vary-by-queryvary-by-query

属性类型示例
StringMakeMake,Model

vary-by-query 接受查询字符串(Keys) 中逗号分隔的 Query 列表,它们在任何列出的键值发生更改时触发缓存刷新。

以下示例监视 MakeModel 值。该示例将缓存提供给 Web 服务器的每个不同 MakeModel 的内容:

  1. <cache vary-by-query="Make,Model">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

vary-by-routevary-by-route

属性类型示例
StringMakeMake,Model

vary-by-route 接受路由参数名称的逗号分隔列表,用于在路由数据参数值发生更改时触发缓存刷新。

示例:

Startup.cs

  1. routes.MapRoute(
  2. name: "default",
  3. template: "{controller=Home}/{action=Index}/{Make?}/{Model?}");

Index.cshtml:

  1. <cache vary-by-route="Make,Model">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

vary-by-cookievary-by-cookie

属性类型示例
String.AspNetCore.Identity.Application.AspNetCore.Identity.Application,HairColor

vary-by-cookie 接受 Cookie 名称的逗号分隔列表,用于在 Cookie 值发生更改时触发缓存刷新。

下例监视与 ASP.NET Core 标识相关联的 cookie。当用户进行身份验证时,标识 cookie 中的更改就会触发缓存刷新:

  1. <cache vary-by-cookie=".AspNetCore.Identity.Application">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

vary-by-uservary-by-user

属性类型示例默认
Booleantruefalsetrue

vary-by-user 指定当已登录用户(或上下文主体)发生更改时是否应重置缓存。当前用户也称为请求上下文主体,可通过引用 @User.Identity.Name 在 Razor 视图中查看。

下面的示例监视当前登录的用户触发缓存刷新:

  1. <cache vary-by-user="true">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

通过登录和注销周期,使用此属性将内容维护在缓存中。当值设置为 true 时,身份验证周期会使已经过身份验证的用户的缓存失效。缓存无效是因为用户进行身份验证时生成了一个新的唯一 cookie 值。如果 cookie 不存在或已过期,则会维持缓存以呈现匿名状态。如果用户未经过身份验证,则会维持缓存。

vary-byvary-by

属性类型示例
String@Model

vary-by 允许自定义缓存的数据。当属性的字符串值引用的对象发生更改时,会更新缓存标记帮助程序的内容。通常将模型值的字符串串联分配给此属性。从效果上看,这导致了更新任何已连接的值都会使缓存无效。

以下示例假定视图的控制器方法将两个路由参数 myParam1myParam2 的整数值相加,并将其作为单个模型属性返回。当此总和更改时,会再次呈现并缓存缓存标记帮助程序的内容。

操作:

  1. public IActionResult Index(string myParam1, string myParam2, string myParam3)
  2. {
  3. int num1;
  4. int num2;
  5. int.TryParse(myParam1, out num1);
  6. int.TryParse(myParam2, out num2);
  7. return View(viewName, num1 + num2);
  8. }

Index.cshtml:

  1. <cache vary-by="@Model">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

prioritypriority

属性类型示例默认
CacheItemPriorityHighLowNeverRemoveNormalNormal

priority 为内置缓存提供程序提供缓存逐出指导。在内存压力下,Web 服务器将首先逐出 Low 缓存项。

示例:

  1. <cache priority="High">
  2. Current Time Inside Cache Tag Helper: @DateTime.Now
  3. </cache>

priority 属性并不能保证特定级别的缓存保留。CacheItemPriority 仅供参考。将此属性设置为 NeverRemove 并不能保证缓存项将始终保留。请参阅其他资源部分中的相关主题,以获取详细信息。

缓存标记帮助程序依赖于内存缓存服务如果尚未添加该服务,缓存标记帮助程序将为你添加。

其他资源Additional resources