ASP.NET Core MVC 中的缓存标记帮助程序

作者:Peter Kellner

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

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

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

<cache>@DateTime.Now</cache>

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

缓存标记帮助程序属性

enabled

属性类型 示例 默认值
布尔 truefalse true

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

示例:

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

expires-on

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

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

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

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

expires-after

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

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

示例:

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

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

expires-sliding

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

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

示例:

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

vary-by-header

属性类型 示例
字符串 User-AgentUser-Agent,content-encoding

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

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

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

vary-by-query

属性类型 示例
字符串 MakeMake,Model

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

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

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

vary-by-route

属性类型 示例
字符串 MakeMake,Model

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

示例:

Startup.cs

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

Index.cshtml

<cache vary-by-route="Make,Model">
    Current Time Inside Cache Tag Helper: @DateTime.Now
</cache>
属性类型 示例
字符串 .AspNetCore.Identity.Application.AspNetCore.Identity.Application,HairColor

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

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

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

vary-by-user

属性类型 示例 默认值
布尔 truefalse true

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

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

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

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

vary-by

属性类型 示例
字符串 @Model

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

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

操作:

public IActionResult Index(string myParam1, string myParam2, string myParam3)
{
    int num1;
    int num2;
    int.TryParse(myParam1, out num1);
    int.TryParse(myParam2, out num2);
    return View(viewName, num1 + num2);
}

Index.cshtml

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

priority

属性类型 示例 默认值
CacheItemPriority High, Low, NeverRemove, Normal Normal

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

示例:

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

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

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

其他资源