Proveedor de estado de sesión de ASP.NET para Azure Cache for Redis

Azure Cache for Redis proporciona un proveedor de estado de sesión que se puede usar para almacenar el estado de una sesión en memoria con Azure Cache for Redis, en lugar de en una base de datos de SQL Server. Para usar el proveedor de estado de sesión de caché, configure primero su caché y, después, configure su aplicación ASP.NET para caché mediante el paquete NuGet de estado de sesión de Azure Cache for Redis. En el caso de las aplicaciones ASP.NET Core, lea Administración del estado y la sesión en ASP.NET Core.

En una aplicación de nube, no suele ser práctico evitar almacenar algún tipo de estado para una sesión de usuario, pero algunos enfoques afectan al rendimiento y a la escalabilidad más que otros. Si tiene que almacenar el estado, la mejor solución es que la cantidad sea reducida y que se almacene en cookies. Si esto no es factible, entonces lo mejor es usar el estado de sesión de ASP.NET con un proveedor de caché distribuida en memoria. La peor solución desde el punto de vista del rendimiento y la escalabilidad es usar un proveedor de estado de sesión con copia de seguridad de base de datos. En este artículo se ofrecen instrucciones sobre cómo usar el proveedor de estado de sesión de ASP.NET para Azure Cache for Redis. Para información sobre otras opciones de estado de sesión, consulte Opciones de estado de sesión ASP.NET.

Almacenamiento del estado de sesión ASP.NET en la memoria caché

Para configurar una aplicación cliente en Visual Studio usando el paquete NuGet de estado de sesión de Azure Cache for Redis, en el menú Herramientas, seleccione Administrador de paquetes NuGet y Consola del Administrador de paquetes.

Ejecute el siguiente comando desde la ventana Package Manager Console.

Install-Package Microsoft.Web.RedisSessionStateProvider

Importante

Si usa la característica de clústeres del nivel premium, debe usar RedisSessionStateProvider 2.0.1 o superior; de lo contrario, se produce una excepción. El cambio a la versión 2.0.1 o superior se considera un cambio importante.

El paquete NuGet de proveedor de estado de sesión de Redis tiene una dependencia en el paquete StackExchange.Redis. Si el paquete StackExchange.Redis no existe en el proyecto, se instalará.

El paquete NuGet descarga y agrega las referencias de ensamblado necesarias y agrega la siguiente sección al archivo web.config. Esta sección contiene la configuración necesaria para que la aplicación ASP.NET use el proveedor de estado de sesión de Azure Cache for 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>

En la sección comentada se proporciona un ejemplo de los atributos y la configuración de ejemplo de cada uno.

Configure los atributos con los valores de la parte izquierda de la caché en Microsoft Azure Portal y configure los demás valores según prefiera. Para obtener instrucciones acerca de cómo acceder a las propiedades de la caché, consulte Configuración de Azure Cache for Redis.

  • host : especifique el punto de conexión de la caché.
  • puerto: use el puerto no TLS/SSL o el puerto TLS/SSL, según la configuración de TLS.
  • accessKey : use la clave primaria o secundaria para la caché.
  • ssl: true si desea proteger las comunicaciones de la caché o el cliente con TLS; de lo contrario, false. Asegúrese de especificar el puerto correcto.
    • El puerto no TLS está deshabilitado de forma predeterminada para las cachés nuevas. Especifique true en este valor para usar el puerto TLS. Para más información sobre cómo habilitar el puerto no TLS, vea la sección Puertos de acceso del tema sobre la configuración de una caché.
  • throwOnError: true si quiere que se produzca una excepción en caso de error; false si quiere que la operación devuelva un error silencioso. Puede comprobar si hay un error revisando la propiedad estática Microsoft.Web.Redis.RedisSessionStateProvider.LastException. El valor predeterminado es true.
  • retryTimeoutInMilliseconds : durante este intervalo, especificado en milisegundos, se reintenta realizar las operaciones que generan errores. El primer reintento ocurre después de 20 milisegundos y los reintentos posteriores ocurren cada segundo hasta que expira el intervalo retryTimeoutInMillisecond. Inmediatamente después de este intervalo, la operación se reintenta una última vez. Si sigue fallando, se devuelve la excepción al autor de la llamada, en función de la configuración de throwOnError. El valor predeterminado es 0, lo que significa que no hay reintentos.
  • databaseId : especifica qué base de datos se va a usar para los datos de salida de la memoria caché. Si no se especifica, se usa el valor predeterminado de 0.
  • applicationName{<Application Name>_<Session ID>}_Data: las claves se almacenan en Redis como . Este esquema de nomenclatura permite que varias aplicaciones compartan la misma instancia de Redis. Este parámetro es opcional y, si no se especifica, se usa un valor predeterminado.
  • connectionTimeoutInMilliseconds: esta opción le permite invalidar la configuración de connectTimeout en el cliente de StackExchange.Redis. Si no se especifica, se usa el valor predeterminado de connectTimeout, que es 5000. Para obtener más información, consulte el modelo de configuración de StackExchange.Redis.
  • operationTimeoutInMilliseconds : esta opción le permite invalidar la configuración de syncTimeout en el cliente de StackExchange.Redis. Si no se especifica, se usa 1000 como valor predeterminado de syncTimeout. Para obtener más información, consulte el modelo de configuración de StackExchange.Redis.
  • redisSerializerType: esta opción permite especificar la serialización personalizada del contenido de la sesión que se envía a Redis. El tipo especificado debe implementar Microsoft.Web.Redis.ISerializer y debe declarar el constructor sin parámetros público. De manera predeterminada, se usa System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.

Para obtener más información sobre estas propiedades, consulte el anuncio de entrada de blog original en Announcing ASP.NET Session State Provider for Redis(Anuncio de proveedor de estado de sesión de ASP.NET para Redis).

No olvide comentar la sección del proveedor de estado de sesión InProc estándar en el archivo 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> -->

Una vez realizados estos pasos, la aplicación está configurada para usar el proveedor de estado de sesión de Azure Cache for Redis. Cuando se usa el estado de sesión en la aplicación, se almacena en una instancia de Azure Cache for Redis.

Importante

Los datos almacenados en la memoria caché deben ser serializables, a diferencia de los datos que se puedan almacenar en el proveedor de estado de sesión de ASP.NET en memoria predeterminado. Al usar el proveedor de estado de sesión para Redis, asegúrese de que los tipos de datos que se almacenan en el estado de sesión sean serializables.

Opciones de estado de sesión de ASP.NET

  • Proveedor de estado de sesión en memoria: este proveedor almacena el estado de sesión en la memoria. La ventaja de usar este proveedor es que es sencillo y rápido. Aun así, con el proveedor en memoria no se pueden escalar las aplicaciones web, ya que no se distribuye.
  • Proveedor de estado de sesión de SQL Server: este proveedor almacena el estado de sesión en SQL Server. Use este proveedor si desea conservar el estado de sesión en un almacenamiento persistente. Puede escalar la aplicación web, pero el uso de SQL Server para la sesión afectará al rendimiento de dicha aplicación. También se puede utilizar este proveedor con una configuración de OLTP en memoria para ayudarle a mejorar el rendimiento.
  • Proveedor de estado de sesión en memoria distribuida como proveedor de estado de sesión de Azure Cache for Redis: este proveedor le ofrece lo mejor de ambos mundos. La aplicación web puede tener un proveedor de estado de sesión sencillo, rápido y escalable. Como este proveedor almacena el estado de sesión en una memoria caché, la aplicación tiene que tomar en consideración todas las características asociadas al comunicarse con una memoria caché en memoria distribuida, como los errores de red transitorios. Para conocer los procedimientos recomendados sobre el uso de caché, consulte Guía de almacenamiento en caché de patrones y prácticas de Azure Cloud Application Design and Implementation Guidance (Guía de implementación e diseño de aplicaciones en la nube de Microsoft).

Para obtener más información sobre el estado de sesión y otros procedimientos recomendados, consulte Procedimientos recomendados de desarrollo web (compilación de aplicaciones en la nube reales con Azure).

Proveedores de estado de sesión de terceros

Pasos siguientes

Consulte ASP.NET Output Cache Provider for Azure Cache for Redis (Proveedor de caché de salida de ASP.NET para Azure Cache for Redis).