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

O Cache do Azure para Redis fornece um provedor de estado de sessão que você pode usar para armazenar o estado de sessão na memória com o Cache do Azure para Redis em vez de um banco de dados do SQL Server. Para usar o provedor de estado de sessão de cache, primeiro configure o cache e, em seguida, configure o aplicativo ASP.NET para o cache usando o pacote NuGet de Estado de Sessão do Cache do Azure para Redis. Para aplicativos ASP.NET Core, leia Gerenciamento de sessão e estado no ASP.NET Core.

Geralmente, não é prático em um aplicativo de nuvem para evitar o armazenamento de alguma forma de estado para uma sessão de usuário, mas algumas abordagens afetam o desempenho e a escalabilidade mais do que outras. Se você precisar armazenar o estado, a melhor solução será manter o estado em uma quantidade pequena e armazená-lo em cookies. Se isso não for viável, a próxima solução mais adequada será usar o estado de sessão ASP.NET com um provedor para cache distribuído na memória. A pior solução de um ponto de vista de escalabilidade e desempenho é usar um provedor de estado de sessão com backup em um banco de dados. Este artigo fornece diretrizes sobre como usar o Provedor de Estado de Sessão do ASP.NET para o Cache do Azure para Redis. Para saber mais sobre outras opções de estado de sessão, consulte Opções de estado da sessão ASP.NET.

Armazenar o estado da sessão ASP.NET no cache

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

Execute o comando a seguir na janela Package Manager Console.

Install-Package Microsoft.Web.RedisSessionStateProvider

Importante

Se você estiver usando o recurso de cluster a partir da camada premium, use RedisSessionStateProvider 2.0.1 ou superior, caso contrário uma exceção será emitida. A migração para a versão 2.0.1 ou superior é uma alteração interruptiva.

O pacote NuGet do Provedor de estado de sessão Redis tem uma dependência do pacote StackExchange.Redis. Se o pacote StackExchange.Redis. não estiver presente em seu projeto, ele será instalado.

O pacote do 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 o aplicativo ASP.NET usar o Provedor de Estado de Sessão do Cache do Azure para Redis.

<sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
    <!-- Either use 'connectionString' OR 'settingsClassName' and 'settingsMethodName' OR use 'host','port','accessKey','ssl','connectionTimeoutInMilliseconds' and 'operationTimeoutInMilliseconds'. -->
    <!-- 'throwOnError','retryTimeoutInMilliseconds','databaseId' and 'applicationName' can be used with both options. -->
    <!--
      <add name="MySessionStateStore" 
        host = "127.0.0.1" [String]
        port = "" [number]
        accessKey = "" [String]
        ssl = "false" [true|false]
        throwOnError = "true" [true|false]
        retryTimeoutInMilliseconds = "5000" [number]
        databaseId = "0" [number]
        applicationName = "" [String]
        connectionTimeoutInMilliseconds = "5000" [number]
        operationTimeoutInMilliseconds = "1000" [number]
        connectionString = "<Valid StackExchange.Redis connection string>" [String]
        settingsClassName = "<Assembly qualified class name that contains settings method specified below. Which basically return 'connectionString' value>" [String]
        settingsMethodName = "<Settings method should be defined in settingsClass. It should be public, static, does not take any parameters and should have a return type of 'String', which is basically 'connectionString' value.>" [String]
        loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String]
        loggingMethodName = "<Logging method should be defined in loggingClass. It should be public, static, does not take any parameters and should have a return type of System.IO.TextWriter.>" [String]
        redisSerializerType = "<Assembly qualified class name that implements Microsoft.Web.Redis.ISerializer>" [String]
      />
    -->
    <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider"
         host=""
         accessKey=""
         ssl="true" />
  </providers>
</sessionState>

A seção comentada fornece um exemplo dos atributos e as configurações de exemplos de cada atributo.

Configure os atributos com os valores à esquerda do cache no portal do Microsoft Azure e configure os outros valores conforme desejado. Para obter instruções sobre como acessar as propriedades do cache, consulte Definir configurações do Cache Redis do Azure.

  • host – especifique o ponto de extremidade do seu cache.
  • porta – use sua porta TLS/SSL ou não TLS/SSL, dependendo das configurações de TLS.
  • accessKey – use a chave primária ou secundária do seu cache.
  • ssl – true, se você quiser proteger as comunicações de cache/cliente com TLS. Caso contrário, false. Especifique a porta correta.
    • A porta não TLS é desabilitada por padrão para novos caches. Especifique true nessa configuração para usar a porta TLS. Para obter mais informações sobre como habilitar a porta não TLS, confira a seção Portas de Acesso no artigo  Configurar um cache.
  • throwOnError – true se você quiser que uma exceção seja lançada quando houver falha, ou false se quiser que a operação falhe silenciosamente. Você pode verificar se houve uma falha conferindo a propriedade estática Microsoft.Web.Redis.RedisSessionStateProvider.LastException. O padrão é true.
  • retryTimeoutInMilliseconds – as operações que apresentam falhas recebem uma nova tentativa durante esse intervalo, especificado em milissegundos. A primeira nova tentativa ocorre após 20 milissegundos e, em seguida, novas tentativas ocorrem a cada segundo até que o intervalo de retryTimeoutInMilliseconds expire. Imediatamente após esse intervalo, a operação será repetida uma última vez. Se ainda houver falha, a exceção será devolvida para o chamador, dependendo da configuração throwOnError. O valor padrão é 0, que significa nenhuma tentativa nova.
  • databaseId – especifica qual banco de dados usar para os dados de saída do cache. Se esse campo não for especificado, o valor padrão 0 será usado.
  • applicationName – as chaves são armazenadas no Redis como {<Application Name>_<Session ID>}_Data. Esse esquema de nomenclatura permite que vários aplicativos compartilhem a mesma instância do Redis. Esse parâmetro é opcional e, se você não configurá-lo, um valor padrão é usado.
  • connectionTimeoutInMilliseconds – essa configuração permite a substituição da configuração connectTimeout no cliente StackExchange.Redis. Se ela não for especificada, a configuração padrão do syncTimeout, 1000, será usada. Para obter mais informações, consulte Modelo de configuração StackExchange.Redis.
  • operationTimeoutInMilliseconds – essa configuração permite a substituição da configuração de syncTimeout no cliente StackExchange.Redis. Se não for especificada, a configuração syncTimeout padrão de 1000 será usada. Para obter mais informações, consulte Modelo de configuração StackExchange.Redis.
  • redisSerializerType – essa configuração permite que você especifique a serialização personalizada de conteúdo da sessão que é enviado ao Redis. O tipo especificado deve implementar Microsoft.Web.Redis.ISerializer e deve declarar um construtor público sem parâmetros. Por padrão System.Runtime.Serialization.Formatters.Binary.BinaryFormatter é usado.

Para saber mais sobre essas propriedades, consulte o anúncio original da postagem do blog em Anunciando o Provedor de estado de sessão ASP.NET para Redis.

Não se esqueça de codificar como comentário a seção do provedor de estado de sessão InProc padrão no web.config.

<!-- <sessionState mode="InProc"
     customProvider="DefaultSessionProvider">
     <providers>
        <add name="DefaultSessionProvider"
              type="System.Web.Providers.DefaultSessionStateProvider,
                    System.Web.Providers, Version=1.0.0.0, Culture=neutral,
                    PublicKeyToken=31bf3856ad364e35"
              connectionStringName="DefaultConnection" />
      </providers>
</sessionState> -->

Após a execução dessas etapas, o aplicativo será configurado para usar o Provedor de Estado de Sessão do Cache do Azure para Redis. Quando você usa o estado de sessão no aplicativo, ele é armazenado em uma instância do Cache do Azure para Redis.

Importante

Os dados armazenados em cache devem ser serializáveis, ao contrário dos dados que podem ser armazenados no Provedor de estado de sessão padrão do ASP.NET na memória. Quando o Provedor de estado de sessão para Redis for usado, certifique-se de que os tipos de dados que estão sendo armazenados no estado de sessão sejam serializáveis.

Opções de estado da sessão ASP.NET

  • Provedor de estado de sessão na memória - Esse provedor armazena o Estado da sessão na memória. A vantagem de usar esse provedor é que ele é simples e rápido. No entanto, não é possível dimensionar seus Aplicativos Web se você estiver usando o provedor na memória, pois ele não é distribuído.
  • Provedor de estado de sessão do SQL Server - Esse provedor armazena o Estado da sessão no SQL Server. Use esse provedor se quiser armazenar o estado da Sessão em um armazenamento persistente. Você pode dimensionar seu Aplicativo Web, mas o uso do Sql Server para sessão afeta o desempenho de seu Aplicativo Web. Você também pode usar este provedor com uma Configuração de OLTP na memória para ajudar a melhorar o desempenho.
  • Provedor de Estado de Sessão Distribuído na Memória, como o Provedor de Estado de Sessão do Cache do Azure para Redis - Esse provedor oferece o melhor dos dois mundos. Seu Aplicativo Web pode ter um Provedor de estado de sessão simples, rápido e escalonável. Como esse provedor armazena o Estado da sessão em um Cache, seu aplicativo precisa levar em consideração todas as características associadas ao conversar com um Cache distribuído na memória, por exemplo, falhas de rede temporárias. Para obter as práticas recomendadas sobre como usar o Cache, consulte Diretrizes de cache do Microsoft Patterns & Practices Azure Cloud Application Design and Implementation Guidance.

Para saber mais sobre o estado da sessão e outras práticas recomendadas, consulte Práticas recomendadas para o desenvolvimento na Web (Criando aplicativos de nuvem reais com o Azure).

Provedores de estado de sessão de terceiros

Próximas etapas

Confira o Provedor de Cache de Saída do ASP.NET para o Cache do Azure para Redis.