Auxiliar de Marca de Cache no ASP.NET Core MVC

Por Peter Kellner

O Auxiliar de Marca de Cache possibilita melhorar o desempenho de seu aplicativo ASP.NET Core armazenando seu conteúdo em cache no provedor de cache interno do ASP.NET Core.

Para ter uma visão geral dos Auxiliares de Marcação, confira Auxiliares de Marcação no ASP.NET Core.

A seguinte marcação Razor armazena em cache a data atual:

<cache>@DateTime.Now</cache>

A primeira solicitação para a página que contém o Auxiliar de Marca exibe a data atual. Solicitações adicionais mostram o valor armazenado em cache até que o cache expire (padrão de 20 minutos) ou até que a data em cache seja removida do cache.

Atributos do Auxiliar de Marca de Cache

Habilitado

Tipo de Atributo Exemplos Padrão
Boolean true, false true

enabled determina se o conteúdo envolto pelo Auxiliar de Marca de Cache é armazenado em cache. O padrão é true. Se definido como false, a saída renderizada não é armazenada em cache.

Exemplo:

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

expires-on

Tipo de Atributo Exemplo
DateTimeOffset @new DateTime(2025,1,29,17,02,0)

expires-on define uma data do término absoluta para o item em cache.

O exemplo a seguir armazena em cache o conteúdo do Auxiliar de Marca de Cache até às 17:02 de 29 de janeiro de 2025:

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

expires-after

Tipo de Atributo Exemplo Padrão
TimeSpan @TimeSpan.FromSeconds(120) 20 minutos

expires-after define o tempo decorrido desde a primeira solicitação para armazenar o conteúdo em cache.

Exemplo:

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

O Mecanismo de Exibição Razor define o valor padrão expires-after para vinte minutos.

expires-sliding

Tipo de Atributo Exemplo
TimeSpan @TimeSpan.FromSeconds(60)

Define a hora em que uma entrada de cache deverá ser removida se o seu valor não tiver sido acessado.

Exemplo:

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

vary-by-header

Tipo de Atributo Exemplos
String User-Agent, User-Agent,content-encoding

vary-by-header aceita uma lista delimitada por vírgulas de valores de cabeçalho que disparam uma atualização do cache quando eles mudam.

O exemplo a seguir monitora o valor do cabeçalho User-Agent. O exemplo armazena em cache o conteúdo para cada User-Agent diferente apresentado ao servidor Web:

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

vary-by-query

Tipo de Atributo Exemplos
String Make, Make,Model

vary-by-query aceita uma lista delimitada por vírgula de Keys em uma cadeia de consulta (Query) que dispara uma atualização do cache quando o valor de qualquer chave listada é alterado.

O exemplo a seguir monitora os valores de Make e Model. O exemplo armazena em cache o conteúdo para todos os diferentes Make e Model apresentados ao servidor Web:

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

vary-by-route

Tipo de Atributo Exemplos
String Make, Make,Model

vary-by-route aceita uma lista delimitada por vírgulas de nomes de parâmetros de rota que disparam uma atualização do cache quando o valor de parâmetro de dados de rota muda.

Exemplo:

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>
Tipo de Atributo Exemplos
String .AspNetCore.Identity.Application, .AspNetCore.Identity.Application,HairColor

vary-by-cookie aceita uma lista delimitada por vírgulas de cookie nomes que disparam uma atualização de cache quando os valores de cookie são alterados.

O exemplo a seguir monitora o cookie associado ao ASP.NET Core Identity. Quando um usuário é autenticado, uma alteração no Identitycookie dispara uma atualização do cache:

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

vary-by-user

Tipo de Atributo Exemplos Padrão
Boolean true, false true

vary-by-user especifica se o cache é redefinido ou não quando o usuário conectado (ou a Entidade de Contexto) muda. O usuário atual também é conhecido como Entidade do Contexto da Solicitação e pode ser visualizado em uma exibição Razor fazendo referência a @User.Identity.Name.

O exemplo a seguir monitora o usuário conectado atual para disparar uma atualização de cache:

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

Usar esse atributo mantém o conteúdo no cache durante um ciclo de entrada e saída. Quando o valor é definido como true, um ciclo de autenticação invalida o cache para o usuário autenticado. O cache é invalidado porque um novo valor cookie exclusivo é gerado quando um usuário é autenticado. O cache é mantido no estado anônimo quando nenhum cookie estiver presente ou o cookie tiver expirado. Se o usuário não estiver autenticado, o cache será mantido.

vary-by

Tipo de Atributo Exemplo
String @Model

vary-by permite a personalização de quais dados são armazenados em cache. Quando o objeto referenciado pelo valor de cadeia de caracteres do atributo é alterado, o conteúdo do Auxiliar de Marca de Cache é atualizado. Frequentemente, uma concatenação de cadeia de caracteres de valores do modelo é atribuída a este atributo. Na verdade, isso resulta em um cenário em que uma atualização de qualquer um dos valores concatenados invalida o cache.

O exemplo a seguir supõe que o método do controlador que renderiza a exibição somas o valor inteiro dos dois parâmetros de rota, myParam1 e myParam2, e os retorna a soma como a propriedade de modelo única. Quando essa soma é alterada, o conteúdo do Auxiliar de Marca de Cache é renderizado e armazenado em cache novamente.

Ação:

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

Tipo de Atributo Exemplos Padrão
CacheItemPriority High, Low, NeverRemove, Normal Normal

priority fornece diretrizes de remoção do cache para o provedor de cache interno. O servidor Web remove entradas de cache Low primeiro quando está sob demanda de memória.

Exemplo:

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

O atributo priority não assegura um nível específico de retenção de cache. CacheItemPriority é apenas uma sugestão. Configurar esse atributo como NeverRemove não assegura que os itens armazenados em cache sempre sejam retidos. Veja os tópicos na seção Recursos Adicionais para obter mais informações.

O Auxiliar de Marca de Cache é dependente do serviço de cache de memória. O Auxiliar de Marca de Cache adicionará o serviço se ele não tiver sido adicionado.

Recursos adicionais