Azure Cache for Redis の ASP.NET セッション状態プロバイダー

Azure Cache for Redis には、セッション状態プロバイダーが用意されています。セッション状態プロバイダーを使用すると、セッション状態を SQL Server データベースにではなく Azure Cache for Redis でメモリ内に格納することができます。 キャッシュ セッション状態プロバイダーを使用するには、まず対象のキャッシュを構成し、Azure Cache for Redis Session State NuGet パッケージを使用して、キャッシュに必要な構成を ASP.NET アプリケーションに対して行います。 ASP.NET Core アプリケーションの場合は、ASP.NET Core でのセッションと状態管理に関するページを参照してください。

クラウド アプリケーションでは、ユーザー セッションの状態をなんらかの形式で格納するのを避けるのは、多くの場合、実用的ではないとはいえ、方法によっては、パフォーマンスとスケーラビリティに与える影響がより大きくなります。 状態を格納する必要がある場合は、状態の量を少なくし、Cookie に格納することをお勧めします。 この方法を利用できない場合は、ASP.NET セッション状態と分散型メモリ内キャッシュのプロバイダーを使用することを次にお勧めします。 パフォーマンスとスケーラビリティの観点から最もお勧めできないのは、データベース利用のセッション状態プロバイダーを使用する方法です。 この記事では、Azure Cache for Redis の ASP.NET セッション状態プロバイダーの使用方法についてご案内します。 その他のセッション状態のオプションについては、 ASP.NET セッション状態のオプションに関するトピックを参照してください。

ASP.NET セッション状態をキャッシュに格納する

Visual Studio で Azure Cache for Redis Session State NuGet パッケージを使用してクライアント アプリケーションを構成するには、 [ツール] メニューで [NuGet パッケージ マネージャー][パッケージ マネージャー コンソール] の順に選択します。

[Package Manager Console] ウィンドウで、次のコマンドを実行します。

Install-Package Microsoft.Web.RedisSessionStateProvider

重要

Premium レベルでクラスター機能を使用する場合は、RedisSessionStateProvider 2.0.1 以降を使用する必要があります。そうしないと、例外がスローされます。 2.0.1 以降への移行は破壊的変更です。

Redis セッション状態プロバイダー NuGet パッケージは、StackExchange.Redis パッケージに依存します。 StackExchange.Redis パッケージは、プロジェクト内に存在しなければインストールされます。

NuGet パッケージがダウンロードされ、必要なアセンブリ参照が追加されて、次のセクションが web.config ファイルに追加されます。 このセクションには、Azure Cache for Redis セッション状態プロバイダーを使うために ASP.NET アプリケーションに必要な構成が含まれます。

<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>

コメント化されたセクションには、属性の例と各属性のサンプル設定が記述されています。

属性の構成には、Microsoft Azure portal のキャッシュの左側にある値を使用してください。その他の値は適宜構成します。 キャッシュのプロパティにアクセスする方法については、「Configure Azure Cache for Redis settings (Azure Cache for Redis の設定を構成する)」を参照してください。

  • host : キャッシュ エンドポイントを指定します。
  • port: TLS の設定に応じて、非 TLS/SSL ポートまたは TLS/SSL ポートを使用します。
  • accessKey : キャッシュのプライマリ キーまたはセカンダリ キーを使用します。
  • ssl: キャッシュとクライアント間の通信を TLS で保護する場合は true、保護しない場合は false を指定します。 必ず適切なポートを指定してください。
    • 既定では、新しいキャッシュに対して非 TLS ポートは無効になっています。 TLS ポートを使用するには、この設定に true を指定します。 非 TLS ポートの有効化の詳細については、キャッシュの構成に関する記事の「アクセス ポート」セクションを参照してください。
  • throwOnError: エラー時に例外をスローする場合は true を、操作の失敗時にエラー 表示を行わない場合は false を指定します。 静的な Microsoft.Web.Redis.RedisSessionStateProvider.LastException プロパティを確認することで、失敗をチェックできます。 既定値は true です。
  • retryTimeoutInMilliseconds: 失敗した操作がこの時間に再試行されます。ミリ秒単位で指定します。 最初の再試行は 20 ミリ秒後に行われ、その後はretryTimeoutInMillisecond の期限が切れるまで、毎秒、再試行されます。 この時間を過ぎるとすぐに、操作が最後に 1 回再試行されます。 操作がまだ失敗する場合、throwOnError の設定によっては、例外が呼び出し元にスローされます。 既定値は 0 です。これは再試行されないことを意味します。
  • databaseId : キャッシュ出力データに使用するデータベースを指定します。 指定されていない場合は、既定値の 0 が使用されます。
  • applicationName: キーが {<Application Name>_<Session ID>}_Data として Redis に格納されます。 この命名規則により、複数のアプリケーションで同じ Redis インスタンスを共有できます。 このパラメーターは省略可能です。指定しない場合は、既定値が使用されます。
  • connectionTimeoutInMilliseconds: この設定によって、StackExchange.Redis クライアントの connectTimeout 設定をオーバーライドすることができます。 指定されていない場合は、connectTimeout 設定の既定値である 5000 が使用されます。 詳細については、 StackExchange.Redis 構成モデルに関するページを参照してください。
  • operationTimeoutInMilliseconds : この設定によって、StackExchange.Redis クライアントの syncTimeout 設定をオーバーライドすることができます。 設定しない場合は、syncTimeout 設定の既定値である 1000 が使用されます。 詳細については、 StackExchange.Redis 構成モデルに関するページを参照してください。
  • redisSerializerType - この設定では、Redis に送信されるセッションの内容のカスタム シリアル化を指定できます。 指定される型では、Microsoft.Web.Redis.ISerializer を実装し、パラメーターのないパブリック コンストラクターを宣言する必要があります。 既定では System.Runtime.Serialization.Formatters.Binary.BinaryFormatter が使用されます。

これらのプロパティの詳細については、 Redis の ASP.NET セッション状態プロバイダーの発表に関する元のブログ投稿を参照してください。

忘れずに、web.config で標準の InProc セッション状態プロバイダーのセクションをコメント化してください。

<!-- <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> -->

これらの手順を実行すると、アプリケーションが Azure Cache for Redis セッション状態プロバイダーを使用するように構成されます。 アプリケーションでセッション状態を使用する場合、その状態は Azure Cache for Redis インスタンスに格納されます。

重要

既定のメモリ内の ASP.NET セッション状態プロバイダーに格納できるデータと異なり、キャッシュに格納されるデータは、シリアル化可能である必要があります。 Redis のセッション状態プロバイダーを使用するときは、セッション状態に格納されるデータ型がシリアル化可能であることを確認してください。

ASP.NET セッション状態のオプション

  • メモリ内のセッション状態プロバイダー: このプロバイダーでは、メモリ内にセッション状態が格納されます。 このプロバイダーを使用するメリットは、単純さとスピードです。 ただし、メモリ内プロバイダーを使用する場合、このプロバイダーは分散型ではないため、Web Apps のスケーリングを行えません。
  • SQL Server のセッション状態プロバイダー: このプロバイダーでは、SQL Server 内にセッション状態が格納されます。 永続的なストレージにセッション状態を格納する場合は、このプロバイダーを使います。 Web Apps はスケーリングできますが、セッションに SQL Server を使うことで、Web Apps のパフォーマンスが影響を受けます。 パフォーマンスを向上させるために、このプロバイダーをインメモリ OLTP 構成で使用することもできます。
  • Azure Cache for Redis セッション状態プロバイダーなどの分散型メモリ内セッション状態プロバイダー: このプロバイダーを使用すると、両方の長所を活用できます。 Web アプリで、単純かつ高速で、スケーラブルなセッション状態プロバイダーを使うことができます。 このプロバイダーではセッション状態がキャッシュに格納されるため、一時的なネットワーク障害など、分散型メモリ内キャッシュとの通信時に関するすべての要素をアプリで考慮する必要があります。 キャッシュの使用に関するベスト プラクティスについては、Microsoft Patterns のキャッシュ ガイダンスに関するページの「Azure Cloud アプリケーションの設計と実装に関するガイダンス」を参照してください

セッション状態とその他のベスト プラクティスの詳細については、 Web 開発に関するベスト プラクティス (Azure を使用した実際のクラウド アプリケーションの構築)に関するページを参照してください。

サードパーティのセッション状態プロバイダー

次のステップ

Azure Cache for Redis の ASP.NET 出力キャッシュ プロバイダー」を参照してください。