Cache de resposta no ASP.NET CoreResponse caching in ASP.NET Core

Por John Luo, Rick Andersone Steve SmithBy John Luo, Rick Anderson, and Steve Smith

Exibir ou baixar código de exemplo (como baixar)View or download sample code (how to download)

O cache de resposta reduz o número de solicitações que um cliente ou proxy faz a um servidor Web.Response caching reduces the number of requests a client or proxy makes to a web server. O cache de resposta também reduz a quantidade de trabalho que o servidor Web executa para gerar uma resposta.Response caching also reduces the amount of work the web server performs to generate a response. O cache de resposta é controlado por cabeçalhos que especificam como você deseja que o cliente, o proxy e o middleware armazenem em cache as respostas.Response caching is controlled by headers that specify how you want client, proxy, and middleware to cache responses.

O atributo ResponseCache participa da configuração de cabeçalhos de cache de resposta.The ResponseCache attribute participates in setting response caching headers. Os clientes e proxies intermediários devem respeitar os cabeçalhos para armazenar em cache as respostas na especificação de cache HTTP 1,1.Clients and intermediate proxies should honor the headers for caching responses under the HTTP 1.1 Caching specification.

Para o cache do lado do servidor que segue a especificação de cache HTTP 1,1, use o middleware de cache de resposta.For server-side caching that follows the HTTP 1.1 Caching specification, use Response Caching Middleware. O middleware pode usar as propriedades ResponseCacheAttribute para influenciar o comportamento de cache do lado do servidor.The middleware can use the ResponseCacheAttribute properties to influence server-side caching behavior.

Cache de resposta baseado em HTTPHTTP-based response caching

A especificação de cache HTTP 1,1 descreve como os caches da Internet devem se comportar.The HTTP 1.1 Caching specification describes how Internet caches should behave. O cabeçalho HTTP primário usado para cache é o controle de cache, que é usado para especificar diretivasde cache.The primary HTTP header used for caching is Cache-Control, which is used to specify cache directives. As diretivas controlam o comportamento do cache à medida que as solicitações fazem seu caminho de clientes para servidores e, à medida que as respostas voltam dos servidores para os clientes.The directives control caching behavior as requests make their way from clients to servers and as responses make their way from servers back to clients. As solicitações e respostas são movidas por meio de servidores proxy, e os servidores proxy também devem estar em conformidade com a especificação de cache HTTP 1,1.Requests and responses move through proxy servers, and proxy servers must also conform to the HTTP 1.1 Caching specification.

As diretivas Cache-Control comuns são mostradas na tabela a seguir.Common Cache-Control directives are shown in the following table.

DirectiveDirective AçãoAction
públicopublic Um cache pode armazenar a resposta.A cache may store the response.
privateprivate A resposta não deve ser armazenada por um cache compartilhado.The response must not be stored by a shared cache. Um cache privado pode armazenar e reutilizar a resposta.A private cache may store and reuse the response.
idade máximamax-age O cliente não aceita uma resposta cuja idade é maior que o número especificado de segundos.The client doesn't accept a response whose age is greater than the specified number of seconds. Exemplos: max-age=60 (60 segundos), max-age=2592000 (1 mês)Examples: max-age=60 (60 seconds), max-age=2592000 (1 month)
no-cacheno-cache Em solicitações: um cache não deve usar uma resposta armazenada para atender à solicitação.On requests: A cache must not use a stored response to satisfy the request. O servidor de origem regenera a resposta para o cliente e o middleware atualiza a resposta armazenada em seu cache.The origin server regenerates the response for the client, and the middleware updates the stored response in its cache.

Em respostas: a resposta não deve ser usada para uma solicitação subsequente sem validação no servidor de origem.On responses: The response must not be used for a subsequent request without validation on the origin server.
sem armazenamentono-store Em solicitações: um cache não deve armazenar a solicitação.On requests: A cache must not store the request.

Em respostas: um cache não deve armazenar nenhuma parte da resposta.On responses: A cache must not store any part of the response.

Outros cabeçalhos de cache que desempenham uma função no Caching são mostrados na tabela a seguir.Other cache headers that play a role in caching are shown in the following table.

CabeçalhoHeader FunçãoFunction
IdadeAge Uma estimativa da quantidade de tempo em segundos desde que a resposta foi gerada ou validada com êxito no servidor de origem.An estimate of the amount of time in seconds since the response was generated or successfully validated at the origin server.
ExpiraExpires O tempo após o qual a resposta é considerada obsoleta.The time after which the response is considered stale.
PragmaPragma Existe para compatibilidade com versões anteriores com caches HTTP/1.0 para definir no-cache comportamento.Exists for backwards compatibility with HTTP/1.0 caches for setting no-cache behavior. Se o cabeçalho de Cache-Control estiver presente, o cabeçalho Pragma será ignorado.If the Cache-Control header is present, the Pragma header is ignored.
VariaVary Especifica que uma resposta armazenada em cache não deve ser enviada, a menos que todos os campos de cabeçalho de Vary coincidam com a solicitação original da resposta armazenada em cache e a nova solicitação.Specifies that a cached response must not be sent unless all of the Vary header fields match in both the cached response's original request and the new request.

Os aspectos do cache baseado em HTTP solicitam diretivas de controle de cacheHTTP-based caching respects request Cache-Control directives

A especificação de cache HTTP 1,1 para o cabeçalho de controle de cache requer um cache para honrar um cabeçalho de Cache-Control válido enviado pelo cliente.The HTTP 1.1 Caching specification for the Cache-Control header requires a cache to honor a valid Cache-Control header sent by the client. Um cliente pode fazer solicitações com um valor de cabeçalho no-cache e forçar o servidor a gerar uma nova resposta para cada solicitação.A client can make requests with a no-cache header value and force the server to generate a new response for every request.

Sempre respeitando os cabeçalhos de solicitação de Cache-Control cliente faz sentido se você considerar a meta do cache HTTP.Always honoring client Cache-Control request headers makes sense if you consider the goal of HTTP caching. Sob a especificação oficial, o Caching destina-se a reduzir a latência e a sobrecarga de rede de satisfazer solicitações em uma rede de clientes, proxies e servidores.Under the official specification, caching is meant to reduce the latency and network overhead of satisfying requests across a network of clients, proxies, and servers. Não é necessariamente uma maneira de controlar a carga em um servidor de origem.It isn't necessarily a way to control the load on an origin server.

Não há nenhum controle de desenvolvedor sobre esse comportamento de cache ao usar o middleware de cache de resposta porque o middleware segue a especificação de cache oficial.There's no developer control over this caching behavior when using the Response Caching Middleware because the middleware adheres to the official caching specification. Os aprimoramentos planejados para o middleware são uma oportunidade de configurar o middleware para ignorar o cabeçalho Cache-Control de uma solicitação ao decidir atender a uma resposta armazenada em cache.Planned enhancements to the middleware are an opportunity to configure the middleware to ignore a request's Cache-Control header when deciding to serve a cached response. Os aprimoramentos planejados oferecem uma oportunidade de controlar melhor a carga do servidor.Planned enhancements provide an opportunity to better control server load.

Outra tecnologia de cache no ASP.NET CoreOther caching technology in ASP.NET Core

Cache na memóriaIn-memory caching

O cache na memória usa a memória do servidor para armazenar dados armazenados em cache.In-memory caching uses server memory to store cached data. Esse tipo de cache é adequado para um único servidor ou para vários servidores usando sessões adesivas.This type of caching is suitable for a single server or multiple servers using sticky sessions. Sessões adesivas significa que as solicitações de um cliente são sempre roteadas para o mesmo servidor para processamento.Sticky sessions means that the requests from a client are always routed to the same server for processing.

Para obter mais informações, consulte Cache na memória no ASP.NET Core.For more information, see Cache na memória no ASP.NET Core.

Cache distribuídoDistributed Cache

Use um cache distribuído para armazenar dados na memória quando o aplicativo estiver hospedado em uma nuvem ou farm de servidores.Use a distributed cache to store data in memory when the app is hosted in a cloud or server farm. O cache é compartilhado entre os servidores que processam solicitações.The cache is shared across the servers that process requests. Um cliente pode enviar uma solicitação que é tratada por qualquer servidor no grupo se os dados armazenados em cache para o cliente estiverem disponíveis.A client can submit a request that's handled by any server in the group if cached data for the client is available. ASP.NET Core funciona com caches distribuídos SQL Server, Redise NCache .ASP.NET Core works with SQL Server, Redis, and NCache distributed caches.

Para obter mais informações, consulte Caching distribuído no ASP.NET Core.For more information, see Caching distribuído no ASP.NET Core.

Auxiliar de marca de cacheCache Tag Helper

Armazene o conteúdo de uma exibição MVC ou página Razor com o auxiliar de marca de cache.Cache the content from an MVC view or Razor Page with the Cache Tag Helper. O auxiliar de marca de cache usa o cache na memória para armazenar dados.The Cache Tag Helper uses in-memory caching to store data.

Para obter mais informações, consulte Auxiliar de Marca de Cache no ASP.NET Core MVC.For more information, see Auxiliar de Marca de Cache no ASP.NET Core MVC.

Auxiliar de Marca de Cache DistribuídoDistributed Cache Tag Helper

Armazene em cache o conteúdo de uma exibição MVC ou página Razor em cenários de nuvem distribuída ou web farm com o auxiliar de marca de cache distribuído.Cache the content from an MVC view or Razor Page in distributed cloud or web farm scenarios with the Distributed Cache Tag Helper. O auxiliar de marca de cache distribuído usa SQL Server, Redisou NCache para armazenar dados.The Distributed Cache Tag Helper uses SQL Server, Redis, or NCache to store data.

Para obter mais informações, consulte Auxiliar de Marca de Cache Distribuído no ASP.NET Core.For more information, see Auxiliar de Marca de Cache Distribuído no ASP.NET Core.

Atributo ResponseCacheResponseCache attribute

O ResponseCacheAttribute especifica os parâmetros necessários para definir os cabeçalhos apropriados no cache de resposta.The ResponseCacheAttribute specifies the parameters necessary for setting appropriate headers in response caching.

Aviso

Desabilite o cache para conteúdo que contém informações para clientes autenticados.Disable caching for content that contains information for authenticated clients. O Caching só deve ser habilitado para conteúdo que não seja alterado com base na identidade de um usuário ou se um usuário estiver conectado.Caching should only be enabled for content that doesn't change based on a user's identity or whether a user is signed in.

VaryByQueryKeys varia a resposta armazenada pelos valores da lista de chaves de consulta fornecida.VaryByQueryKeys varies the stored response by the values of the given list of query keys. Quando um único valor de * é fornecido, o middleware varia as respostas por todos os parâmetros de cadeia de caracteres de consulta de solicitação.When a single value of * is provided, the middleware varies responses by all request query string parameters.

O middleware de cache de resposta deve estar habilitado para definir a propriedade VaryByQueryKeys.Response Caching Middleware must be enabled to set the VaryByQueryKeys property. Caso contrário, uma exceção de tempo de execução será lançada.Otherwise, a runtime exception is thrown. Não há um cabeçalho HTTP correspondente para a propriedade VaryByQueryKeys.There isn't a corresponding HTTP header for the VaryByQueryKeys property. A propriedade é um recurso HTTP manipulado pelo middleware de cache de resposta.The property is an HTTP feature handled by Response Caching Middleware. Para que o middleware atenda a uma resposta armazenada em cache, a cadeia de caracteres de consulta e o valor da cadeia de caracteres de consulta devem corresponder a uma solicitação anterior.For the middleware to serve a cached response, the query string and query string value must match a previous request. Por exemplo, considere a sequência de solicitações e os resultados mostrados na tabela a seguir.For example, consider the sequence of requests and results shown in the following table.

SolicitaçãoRequest ResultadoResult
http://example.com?key1=value1 Retornado do servidor.Returned from the server.
http://example.com?key1=value1 Retornado do middleware.Returned from middleware.
http://example.com?key1=value2 Retornado do servidor.Returned from the server.

A primeira solicitação é retornada pelo servidor e armazenada em cache no middleware.The first request is returned by the server and cached in middleware. A segunda solicitação é retornada pelo middleware porque a cadeia de caracteres de consulta corresponde à solicitação anterior.The second request is returned by middleware because the query string matches the previous request. A terceira solicitação não está no cache do middleware porque o valor da cadeia de caracteres de consulta não corresponde a uma solicitação anterior.The third request isn't in the middleware cache because the query string value doesn't match a previous request.

O ResponseCacheAttribute é usado para configurar e criar (via IFilterFactory) uma Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter.The ResponseCacheAttribute is used to configure and create (via IFilterFactory) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter. O ResponseCacheFilter executa o trabalho de atualizar os cabeçalhos HTTP e os recursos apropriados da resposta.The ResponseCacheFilter performs the work of updating the appropriate HTTP headers and features of the response. O filtro:The filter:

  • Remove todos os cabeçalhos existentes para Vary, Cache-Controle Pragma.Removes any existing headers for Vary, Cache-Control, and Pragma.
  • Grava os cabeçalhos apropriados com base nas propriedades definidas no ResponseCacheAttribute.Writes out the appropriate headers based on the properties set in the ResponseCacheAttribute.
  • Atualiza o recurso HTTP de resposta do cache se VaryByQueryKeys estiver definido.Updates the response caching HTTP feature if VaryByQueryKeys is set.

VariaVary

Esse cabeçalho só é gravado quando a propriedade VaryByHeader é definida.This header is only written when the VaryByHeader property is set. A propriedade definida como o valor da propriedade Vary.The property set to the Vary property's value. O exemplo a seguir usa a propriedade VaryByHeader:The following sample uses the VaryByHeader property:

[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Cache1Model : PageModel
{

Usando o aplicativo de exemplo, exiba os cabeçalhos de resposta com as ferramentas de rede do navegador.Using the sample app, view the response headers with the browser's network tools. Os cabeçalhos de resposta a seguir são enviados com a resposta da página Cache1:The following response headers are sent with the Cache1 page response:

Cache-Control: public,max-age=30
Vary: User-Agent

NoStore e Location. NoneNoStore and Location.None

NoStore substitui a maioria das outras propriedades.NoStore overrides most of the other properties. Quando essa propriedade é definida como true, o cabeçalho Cache-Control é definido como no-store.When this property is set to true, the Cache-Control header is set to no-store. Se Location for definido como None:If Location is set to None:

  • Cache-Control está definido como no-store,no-cache.Cache-Control is set to no-store,no-cache.
  • Pragma está definido como no-cache.Pragma is set to no-cache.

Se NoStore for false e Location for None, Cache-Controle Pragma serão definidos como no-cache.If NoStore is false and Location is None, Cache-Control, and Pragma are set to no-cache.

NoStore normalmente é definido como true para páginas de erro.NoStore is typically set to true for error pages. A página Cache2 no aplicativo de exemplo produz cabeçalhos de resposta que instruem o cliente a não armazenar a resposta.The Cache2 page in the sample app produces response headers that instruct the client not to store the response.

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class Cache2Model : PageModel
{

O aplicativo de exemplo retorna a página Cache2 com os seguintes cabeçalhos:The sample app returns the Cache2 page with the following headers:

Cache-Control: no-store,no-cache
Pragma: no-cache

Localização e duraçãoLocation and Duration

Para habilitar o Caching, Duration deve ser definido como um valor positivo e Location deve ser Any (o padrão) ou Client.To enable caching, Duration must be set to a positive value and Location must be either Any (the default) or Client. A estrutura define o cabeçalho de Cache-Control como o valor de local seguido pelo max-age da resposta.The framework sets the Cache-Control header to the location value followed by the max-age of the response.

as opções de Locationde Any e Client são transvertidas em valores de cabeçalho Cache-Control de public e private, respectivamente.Location's options of Any and Client translate into Cache-Control header values of public and private, respectively. Conforme observado na seção NoStore e Location. None , definir Location como None define os cabeçalhos Cache-Control e Pragma como no-cache.As noted in the NoStore and Location.None section, setting Location to None sets both Cache-Control and Pragma headers to no-cache.

Location.Any (Cache-Control definido como public) indica que o cliente ou qualquer proxy intermediário pode armazenar em cache o valor, incluindo o middleware de cache de resposta.Location.Any (Cache-Control set to public) indicates that the client or any intermediate proxy may cache the value, including Response Caching Middleware.

Location.Client (Cache-Control definido como private) indica que somente o cliente pode armazenar o valor em cache.Location.Client (Cache-Control set to private) indicates that only the client may cache the value. Nenhum cache intermediário deve armazenar em cache o valor, incluindo o middleware de cache de resposta.No intermediate cache should cache the value, including Response Caching Middleware.

Os cabeçalhos de controle de cache simplesmente fornecem diretrizes para clientes e proxies intermediários quando e como armazenar em cache as respostas.Cache control headers merely provide guidance to clients and intermediary proxies when and how to cache responses. Não há nenhuma garantia de que os clientes e proxies respeitarão a especificação de cache HTTP 1,1.There's no guarantee that clients and proxies will honor the HTTP 1.1 Caching specification. O middleware de cache de resposta sempre segue as regras de cache apresentadas pela especificação.Response Caching Middleware always follows the caching rules laid out by the specification.

O exemplo a seguir mostra o modelo de página Cache3 do aplicativo de exemplo e os cabeçalhos produzidos pela configuração Duration e deixando o valor de Location padrão:The following example shows the Cache3 page model from the sample app and the headers produced by setting Duration and leaving the default Location value:

[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public class Cache3Model : PageModel
{

O aplicativo de exemplo retorna a página Cache3 com o seguinte cabeçalho:The sample app returns the Cache3 page with the following header:

Cache-Control: public,max-age=10

Perfis de cacheCache profiles

Em vez de duplicar as configurações de cache de resposta em vários atributos de ação do controlador, os perfis de cache podem ser configurados como opções ao configurar MVC/Razor Pages no Startup.ConfigureServices.Instead of duplicating response cache settings on many controller action attributes, cache profiles can be configured as options when setting up MVC/Razor Pages in Startup.ConfigureServices. Os valores encontrados em um perfil de cache referenciado são usados como os padrões pelo ResponseCacheAttribute e são substituídos por todas as propriedades especificadas no atributo.Values found in a referenced cache profile are used as the defaults by the ResponseCacheAttribute and are overridden by any properties specified on the attribute.

Configure um perfil de cache.Set up a cache profile. O exemplo a seguir mostra um perfil de cache de 30 segundos no Startup.ConfigureServicesdo aplicativo de exemplo:The following example shows a 30 second cache profile in the sample app's Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.CacheProfiles.Add("Default30",
            new CacheProfile()
            {
                Duration = 30
            });
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

O modelo de página Cache4 do aplicativo de exemplo faz referência ao perfil de cache Default30:The sample app's Cache4 page model references the Default30 cache profile:

[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{

O ResponseCacheAttribute pode ser aplicado a:The ResponseCacheAttribute can be applied to:

  • Manipuladores de página Razor (classes) – atributos não podem ser aplicados a métodos de manipulador.Razor Page handlers (classes) – Attributes can't be applied to handler methods.
  • Controladores MVC (classes).MVC controllers (classes).
  • As ações do MVC (métodos) – atributos de nível de método substituem as configurações especificadas em atributos de nível de classe.MVC actions (methods) – Method-level attributes override the settings specified in class-level attributes.

O cabeçalho resultante aplicado à resposta da página Cache4 pelo perfil de cache Default30:The resulting header applied to the Cache4 page response by the Default30 cache profile:

Cache-Control: public,max-age=30

Recursos adicionaisAdditional resources