Fornecedor da Cache de Saída ASP.NET para a Cache do Azure para Redis

O Provedor de Cache de Saída Redis é um mecanismo de armazenamento fora do processo para dados de cache de saída. Esses dados são especificamente para respostas HTTP completas (cache de saída de página). O provedor se conecta ao novo ponto de extensibilidade do provedor de cache de saída que foi introduzido no ASP.NET 4.

Para aplicativos ASP.NET Core, consulte Cache de saída em ASP.NET núcleo usando Redis no .NET 8.

Para usar o Provedor de Cache de Saída Redis, primeiro configure o cache e, em seguida, configure o aplicativo ASP.NET usando o pacote NuGet do Provedor de Cache de Saída Redis. Este artigo fornece orientação sobre como configurar seu aplicativo para usar o Provedor de Cache de Saída Redis. Para obter mais informações sobre como criar e configurar um Cache do Azure para instância Redis, consulte Criar um cache.

Armazenar ASP.NET saída da página principal no Redis

Para obter uma especificação completa do recurso, consulte AS.NET cache de saída principal.

Para obter um aplicativo de exemplo demonstrando o uso, consulte Aplicativo Web .NET 8 com Cache de Saída Redis e Azure Open AI.

Armazenar ASP.NET saída de página no Redis

Para configurar um aplicativo cliente no Visual Studio usando o pacote NuGet do Cache do Azure para Estado da Sessão Redis, selecione Gerenciador de Pacotes NuGet, Console do Gerenciador de Pacotes no menu Ferramentas .

Execute o seguinte comando a partir da janela Package Manager Console:

Install-Package Microsoft.Web.RedisOutputCacheProvider

O pacote NuGet do Provedor de Cache de Saída Redis tem uma dependência do pacote StackExchange.Redis . Se o pacote StackExchange.Redis não estiver presente em seu projeto, ele será instalado. Para obter mais informações sobre o pacote NuGet do Provedor de Cache de Saída Redis, consulte a página NuGet RedisOutputCacheProvider.

O pacote NuGet baixa e adiciona as referências de assembly necessárias e adiciona a seção a seguir ao seu arquivo web.config. Esta seção contém a configuração necessária para que seu aplicativo ASP.NET use o Provedor de Cache de Saída Redis.

<caching>
  <outputCache defaultProvider="MyRedisOutputCache">
    <providers>
      <add name="MyRedisOutputCache" type="Microsoft.Web.Redis.RedisOutputCacheProvider"
           host=""
           accessKey=""
           ssl="true" />
    </providers>
  </outputCache>
</caching>

Configure os atributos na primeira coluna com os valores do seu cache no portal do Microsoft Azure. Além disso, configure os outros valores desejados. Para obter instruções sobre como acessar suas propriedades de cache, consulte Configurar o Cache do Azure para configurações Redis.

Atributo Type Predefinido Description
_host* string "Localhost" O endereço IP do servidor Redis ou o nome do host
port inteiro positivo 6379 (não-TLS/SSL)
6380 (TLS/SSL)
Porta do servidor Redis
chave de acesso string "" Senha do servidor Redis quando a autorização Redis está ativada. O valor é uma cadeia de caracteres vazia por padrão, o que significa que o provedor de estado da sessão não usa nenhuma senha quando se conecta ao servidor Redis. Se o seu servidor Redis estiver em uma rede acessível publicamente, como o Cache do Azure para Redis, certifique-se de habilitar a autorização do Redis para melhorar a segurança e fornecer uma senha segura.
SSL boolean falso Se deseja se conectar ao servidor Redis via TLS. Esse valor é false por padrão porque o Redis não suporta TLS por padrão. Se estiver a utilizar a Cache do Azure para Redis, que suporta SSL por predefinição, certifique-se de que define este valor como true para melhorar a segurança.

A porta não-TLS é desabilitada por padrão para novos caches. Especifique true para essa configuração para usar a porta não-TLS. Para obter mais informações sobre como habilitar a porta não-TLS, consulte a seção Portas de acesso no artigo Configurar um cache .
databaseIdNumber inteiro positivo 0 Esse atributo pode ser especificado somente por meio de web.config ou AppSettings.

Especifique qual banco de dados Redis usar.
connectionTimeoutInMilliseconds inteiro positivo Fornecido por StackExchange.Redis Usado para definir ConnectTimeout ao criar StackExchange.Redis.ConnectionMultiplexer.
operationTimeoutInMilliseconds inteiro positivo Fornecido por StackExchange.Redis Usado para definir SyncTimeout ao criar StackExchange.Redis.ConnectionMultiplexer.
connectionString (cadeia de conexão StackExchange.Redis válida) string n/a Uma referência de parâmetro para AppSettings ou web.config, ou então uma cadeia de conexão StackExchange.Redis válida. Esse atributo pode fornecer valores para host, port, accessKey, ssl e outros atributos StackExchange.Redis. Para obter uma visão mais detalhada de connectionString, consulte Setting connectionString na seção Notas de atributo.
configuraçõesClassName
configuraçõesMethodName
string
string
n/a Esses atributos podem ser especificados somente por meio de web.config ou AppSettings.

Use esses atributos para fornecer uma cadeia de conexão. _settingsClassName* deve ser um nome de classe qualificado de assembly que contém o método especificado por settingsMethodName.

O método especificado por settingsMethodName deve ser público, estático e void (não aceitando parâmetros), com um tipo de retorno de string. Esse método retorna a cadeia de conexão real.
loggingClassName
loggingMethodName
string
string
n/a Esses atributos podem ser especificados somente por meio de web.config ou AppSettings.

Use esses atributos para depurar seu aplicativo fornecendo logs do Cache de Estado/Saída da Sessão junto com logs do StackExchange.Redis. loggingClassName deve ser um nome de classe qualificado de assembly que contém o método especificado por loggingMethodName.

O método especificado por loggingMethodName deve ser público, estático e vazio (não aceita parâmetros), com um tipo de retorno de System.IO.TextWriter.
nome_do_aplicativo string O nome do módulo do processo atual ou "/" Somente SessionStateProvider
Esse atributo pode ser especificado somente por meio de web.config ou AppSettings.

O prefixo do nome do aplicativo a ser usado no cache Redis. O cliente pode usar o mesmo cache Redis para fins diferentes. Para garantir que as chaves de sessão não colidam, ele pode ser prefixado com o nome do aplicativo.
throwOnError boolean verdadeiro Somente SessionStateProvider
Esse atributo pode ser especificado somente por meio de web.config ou AppSettings.

Se uma exceção deve ser lançada quando ocorre um erro.

Para obter mais informações sobre throwOnError, consulte Notes on throwOnError na seção Notas de atributo.
retryTimeoutInMilliseconds inteiro positivo 5000 Somente SessionStateProvider
Esse atributo pode ser especificado somente por meio de web.config ou AppSettings.

Quanto tempo tentar novamente quando uma operação falhar. Se esse valor for menor que operationTimeoutInMilliseconds, o provedor não tentará novamente.

Para obter mais informações sobre retryTimeoutInMilliseconds, consulte Notes on retryTimeoutInMilliseconds na seção Notas de atributo.
redisSerializerType string n/a Especifica o nome do tipo qualificado de assembly de uma classe que implementa Microsoft.Web.Redis. Serializador e que contém a lógica personalizada para serializar e desserializar os valores. Para obter mais informações, consulte Sobre redisSerializerType na seção Notas de atributo.

Notas de atributos

Definindo connectionString

O valor de connectionString é usado como chave para buscar a cadeia de conexão real de AppSettings, se essa cadeia de caracteres existir em AppSettings. Se não for encontrado dentro de AppSettings, o valor de connectionString será usado como chave para buscar a cadeia de conexão real na seção web.config ConnectionString, se essa seção existir. Se a cadeia de conexão não existir em AppSettings ou na seção web.config ConnectionString, o valor literal de connectionString será usado como a cadeia de conexão ao criar StackExchange.Redis.ConnectionMultiplexer.

Os exemplos a seguir ilustram como connectionString é usado.

Exemplo 1

<connectionStrings>
    <add name="MyRedisConnectionString" connectionString="mycache.redis.cache.windows.net:6380,password=actual access key,ssl=True,abortConnect=False" />
</connectionStrings>

No web.config, use a chave como valor de parâmetro em vez de valor real.

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             connectionString = "MyRedisConnectionString"/>
    </providers>
</sessionState>

Exemplo 2

<appSettings>
    <add key="MyRedisConnectionString" value="mycache.redis.cache.windows.net:6380,password=actual access key,ssl=True,abortConnect=False" />
</appSettings>

No web.config, use a chave como valor de parâmetro em vez de valor real.

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             connectionString = "MyRedisConnectionString"/>
    </providers>
</sessionState>

Exemplo 3

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             connectionString = "mycache.redis.cache.windows.net:6380,password=actual access key,ssl=True,abortConnect=False"/>
    </providers>
</sessionState>

Notas sobre throwOnError

Atualmente, se ocorrer um erro durante uma operação de sessão, o provedor de estado da sessão lançará uma exceção. Lançar a exceção desliga o aplicativo.

Esse comportamento foi modificado de uma forma que suporta as expectativas dos usuários existentes do provedor de estado de sessão ASP.NET e, ao mesmo tempo, permite que você aja em exceções. O comportamento padrão ainda lança uma exceção quando ocorre um erro, consistente com outros provedores de estado de sessão ASP.NET. O código existente deve funcionar da mesma forma que antes.

Se você definir throwOnError como false, em vez de lançar uma exceção quando ocorrer um erro, ele falhará silenciosamente. Para ver se houve um erro e, em caso afirmativo, descobrir qual foi a exceção, verifique a propriedade estática Microsoft.Web.Redis.RedisSessionStateProvider.LastException.

Notas sobre retryTimeoutInMilliseconds

A configuração retryTimeoutInMilliseconds fornece alguma lógica para simplificar o caso em que uma operação de sessão deve tentar novamente em caso de falha devido a uma falha de rede ou outra coisa. A configuração retryTimeoutInMilliseconds também permite controlar o tempo limite de repetição ou desativar completamente a repetição.

Se você definir retryTimeoutInMilliseconds como um número, por exemplo 2000, quando uma operação de sessão falhar, ela tentará novamente por 2.000 milissegundos antes de tratá-la como um erro. Para que o provedor de estado da sessão aplique essa lógica de repetição, basta configurar o tempo limite. A primeira tentativa acontecerá após 20 milissegundos, o que é suficiente na maioria dos casos quando uma falha de rede acontece. Depois disso, ele tentará novamente a cada segundo até atingir o tempo limite. Logo após o tempo limite, ele tentará novamente mais uma vez para garantir que não cortará o tempo limite em (no máximo) um segundo.

Se você acha que não precisa repetir ou se quiser lidar com a lógica de repetição por conta própria, defina retryTimeoutInMilliseconds como 0. Por exemplo, talvez você não queira repetir quando estiver executando o servidor Redis na mesma máquina que seu aplicativo.

Sobre redisSerializerType

A serialização para armazenar os valores no Redis é feita em um formato binário por padrão, que é fornecido pela classe BinaryFormatter . Use redisSerializerType para especificar o nome do tipo qualificado do assembly de uma classe que implementa Microsoft.Web.Redis.ISerializer e tem a lógica personalizada para serializar e desserializar os valores. Por exemplo, aqui está uma classe de serializador Json usando JSON.NET:

namespace MyCompany.Redis
{
    public class JsonSerializer : ISerializer
    {
        private static JsonSerializerSettings _settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };

        public byte[] Serialize(object data)
        {
            return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data, _settings));
        }

        public object Deserialize(byte[] data)
        {
            if (data == null)
            {
                return null;
            }
            return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data), _settings);
        }
    }
}

Supondo que essa classe seja definida em um assembly com o nome MyCompanyDll, você pode definir o parâmetro redisSerializerType para usá-lo:

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             redisSerializerType = "MyCompany.Redis.JsonSerializer,MyCompanyDll"
             ... />
    </providers>
</sessionState>

Diretiva de cache de saída

Adicione uma diretiva OutputCache a cada página para a qual você deseja armazenar em cache a saída.

<%@ OutputCache Duration="60" VaryByParam="*" %>

No exemplo anterior, os dados da página armazenada em cache permanecem no cache por 60 segundos e uma versão diferente da página é armazenada em cache para cada combinação de parâmetros. Para obter mais informações sobre a diretiva OutputCache, consulte @OutputCache.

Depois de executar essas etapas, seu aplicativo é configurado para usar o Provedor de Cache de Saída Redis.

Provedores de cache de saída de terceiros

Confira o ASP.NET Provedor de Estado da Sessão para o Cache do Azure para Redis.