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

Azure Cache for Redis には、セッション状態プロバイダーが用意されています。セッション状態プロバイダーを使用すると、セッション状態を SQL Server データベースにではなく Azure Cache for Redis でメモリ内に格納することができます。Azure Cache for Redis provides a session state provider that you can use to store your session state in-memory with Azure Cache for Redis instead of a SQL Server database. キャッシュ セッション状態プロバイダーを使用するには、まず対象のキャッシュを構成し、Azure Cache for Redis Session State NuGet パッケージを使用して、キャッシュに必要な構成を ASP.NET アプリケーションに対して行います。To use the caching session state provider, first configure your cache, and then configure your ASP.NET application for cache using the Azure Cache for Redis Session State NuGet package.

ユーザー セッションの状態をなんらかの形で格納しないのは、実際のクラウド アプリケーションでは実用的でない場合が多いですが、方法によっては、パフォーマンスとスケーラビリティに与える影響が大きくなります。It's often not practical in a real-world cloud app to avoid storing some form of state for a user session, but some approaches impact performance and scalability more than others. 状態を格納する必要がある場合は、状態の量を少なくし、Cookie に格納することをお勧めします。If you have to store state, the best solution is to keep the amount of state small and store it in cookies. この方法を利用できない場合は、ASP.NET セッション状態と分散型メモリ内キャッシュのプロバイダーを使用することを次にお勧めします。If that isn't feasible, the next best solution is to use ASP.NET session state with a provider for distributed, in-memory cache. パフォーマンスとスケーラビリティの観点から最もお勧めできないのが、データベースを利用したセッション状態プロバイダーを使用する方法です。The worst solution from a performance and scalability standpoint is to use a database backed session state provider. このトピックでは、Azure Cache for Redis の ASP.NET セッション状態プロバイダーを使用する方法について説明します。This topic provides guidance on using the ASP.NET Session State Provider for Azure Cache for Redis. その他のセッション状態のオプションについては、 ASP.NET セッション状態のオプションに関するトピックを参照してください。For information on other session state options, see ASP.NET Session State options.

ASP.NET セッション状態をキャッシュに格納するStore ASP.NET session state in the cache

Visual Studio で Azure Cache for Redis Session State NuGet パッケージを使用してクライアント アプリケーションを構成するには、 [ツール] メニューで [NuGet パッケージ マネージャー][パッケージ マネージャー コンソール] の順にクリックします。To configure a client application in Visual Studio using the Azure Cache for Redis Session State NuGet package, click NuGet Package Manager, Package Manager Console from the Tools menu.

[Package Manager Console] ウィンドウで、次のコマンドを実行します。Run the following command from the Package Manager Console window.

Install-Package Microsoft.Web.RedisSessionStateProvider

重要

Premium レベルでクラスター機能を使用する場合は、RedisSessionStateProvider 2.0.1 以降を使用する必要があります。そうしないと、例外がスローされます。If you are using the clustering feature from the premium tier, you must use RedisSessionStateProvider 2.0.1 or higher or an exception is thrown. 2.0.1 以降への移行は重大な変更です。詳しくは、「v2.0.0 Breaking Change Details」(v2.0.0 の重大な変更の詳細) をご覧ください。Moving to 2.0.1 or higher is a breaking change; for more information, see v2.0.0 Breaking Change Details. この記事の更新時点での、このパッケージの最新バージョンは 2.2.3 です。At the time of this article update, the current version of this package is 2.2.3.

Redis セッション状態プロバイダー NuGet パッケージは、StackExchange.Redis.StrongName パッケージに依存します。The Redis Session State Provider NuGet package has a dependency on the StackExchange.Redis.StrongName package. StackExchange.Redis.StrongName パッケージは、プロジェクト内に存在しなければインストールされます。If the StackExchange.Redis.StrongName package is not present in your project, it is installed.

注意

厳密な名前を持つ StackExchange.Redis.StrongName パッケージ以外に、厳密な名前を持たない StackExchange.Redis バージョンもあります。In addition to the strong-named StackExchange.Redis.StrongName package, there is also the StackExchange.Redis non-strong-named version. プロジェクトで厳密な名前を持たないバージョンの StackExchange.Redis を使っている場合は、それをアンインストールする必要があります。そうしないと、プロジェクトで名前の競合が発生します。If your project is using the non-strong-named StackExchange.Redis version you must uninstall it, otherwise you get naming conflicts in your project. これらのパッケージの詳細については、.NET キャッシュ クライアントの構成に関するトピックを参照してください。For more information about these packages, see Configure .NET cache clients.

NuGet パッケージがダウンロードされ、必要なアセンブリ参照が追加されて、次のセクションが web.config ファイルに追加されます。The NuGet package downloads and adds the required assembly references and adds the following section into your web.config file. このセクションには、Azure Cache for Redis セッション状態プロバイダーを使うために ASP.NET アプリケーションに必要な構成が含まれます。This section contains the required configuration for your ASP.NET application to use the Azure Cache for Redis Session State Provider.

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

コメント化されたセクションには、属性の例と各属性のサンプル設定が記述されています。The commented section provides an example of the attributes and sample settings for each attribute.

属性の構成には、Microsoft Azure ポータルのキャッシュ ブレードの値を使用してください。その他の値は適宜構成します。Configure the attributes with the values from your cache blade in the Microsoft Azure portal, and configure the other values as desired. キャッシュのプロパティにアクセスする方法については、「Configure Azure Cache for Redis settings (Azure Cache for Redis の設定を構成する)」を参照してください。For instructions on accessing your cache properties, see Configure Azure Cache for Redis settings.

  • host : キャッシュ エンドポイントを指定します。host – specify your cache endpoint.
  • port : SSL の設定に応じて、非 SSL ポートまたは SSL ポートを使用します。port – use either your non-SSL port or your SSL port, depending on the ssl settings.
  • accessKey : キャッシュのプライマリ キーまたはセカンダリ キーを使用します。accessKey – use either the primary or secondary key for your cache.
  • ssl : キャッシュとクライアント間の通信を SSL で保護する場合は true、保護しない場合は false を指定します。ssl – true if you want to secure cache/client communications with ssl; otherwise false. 必ず適切なポートを指定してください。Be sure to specify the correct port.
    • 既定では、新しいキャッシュに対して非 SSL ポートは無効になっています。The non-SSL port is disabled by default for new caches. SSL ポートを使用するには、この設定に true を指定します。Specify true for this setting to use the SSL port. 非 SSL ポートの有効化の詳細については、キャッシュの構成に関するトピックの「アクセス ポート」セクションを参照してください。For more information about enabling the non-SSL port, see the Access Ports section in the Configure a cache topic.
  • throwOnError: 失敗時に例外がスローされるようにする場合は true、操作の失敗時にエラー メッセージが表示されないようにする場合は false を指定します。throwOnError – true if you want an exception to be thrown if there is a failure, or false if you want the operation to fail silently. 静的 Microsoft.Web.Redis.RedisSessionStateProvider.LastException プロパティをチェックすることでエラーを確認できます。You can check for a failure by checking the static Microsoft.Web.Redis.RedisSessionStateProvider.LastException property. 既定値は true です。The default is true.
  • retryTimeoutInMilliseconds: 失敗した操作がこの時間に再試行されます。ミリ秒単位で指定します。retryTimeoutInMilliseconds – Operations that fail are retried during this interval, specified in milliseconds. 最初は 20 ミリ秒後に再試行され、その後 retryTimeoutInMilliseconds の時間が経過するまで 1 秒ごとに再試行されます。The first retry occurs after 20 milliseconds, and then retries occur every second until the retryTimeoutInMilliseconds interval expires. この時間を過ぎるとすぐに、操作が最後に 1 回再試行されます。Immediately after this interval, the operation is retried one final time. 操作が失敗した場合、throwOnError 設定に応じて、例外がスローされて呼び出し元に戻ります。If the operation still fails, the exception is thrown back to the caller, depending on the throwOnError setting. 既定値は 0 です。これは再試行されないことを意味します。The default value is 0, which means no retries.
  • databaseId : キャッシュ出力データに使用するデータベースを指定します。databaseId – Specifies which database to use for cache output data. 指定されていない場合は、既定値の 0 が使用されます。If not specified, the default value of 0 is used.
  • applicationName: キーが {<Application Name>_<Session ID>}_Data として Redis に格納されます。applicationName – Keys are stored in redis as {<Application Name>_<Session ID>}_Data. この命名規則により、複数のアプリケーションで同じ Redis インスタンスを共有できます。This naming scheme enables multiple applications to share the same Redis instance. このパラメーターは省略可能です。指定されていない場合は、既定値が使用されます。This parameter is optional and if you do not provide it a default value is used.
  • connectionTimeoutInMilliseconds : この設定によって、StackExchange.Redis クライアントの connectTimeout 設定をオーバーライドすることができます。connectionTimeoutInMilliseconds – This setting allows you to override the connectTimeout setting in the StackExchange.Redis client. 指定されていない場合は、connectTimeout 設定の既定値である 5000 が使用されます。If not specified, the default connectTimeout setting of 5000 is used. 詳細については、 StackExchange.Redis 構成モデルに関するページを参照してください。For more information, see StackExchange.Redis configuration model.
  • operationTimeoutInMilliseconds : この設定によって、StackExchange.Redis クライアントの syncTimeout 設定をオーバーライドすることができます。operationTimeoutInMilliseconds – This setting allows you to override the syncTimeout setting in the StackExchange.Redis client. 指定されていない場合は、syncTimeout 設定の既定値である 1000 が使用されます。If not specified, the default syncTimeout setting of 1000 is used. 詳細については、 StackExchange.Redis 構成モデルに関するページを参照してください。For more information, see StackExchange.Redis configuration model.
  • redisSerializerType - この設定では、Redis に送信されるセッションの内容のカスタム シリアル化を指定できます。redisSerializerType - This setting allows you to specify custom serialization of session content that is sent to Redis. 指定される型では、Microsoft.Web.Redis.ISerializer を実装し、パラメーターのないパブリック コンストラクターを宣言する必要があります。The type specified must implement Microsoft.Web.Redis.ISerializer and must declare public parameterless constructor. 既定では System.Runtime.Serialization.Formatters.Binary.BinaryFormatter が使用されます。By default System.Runtime.Serialization.Formatters.Binary.BinaryFormatter is used.

これらのプロパティの詳細については、 Redis の ASP.NET セッション状態プロバイダーの発表に関する元のブログ投稿を参照してください。For more information about these properties, see the original blog post announcement at Announcing ASP.NET Session State Provider for Redis.

web.config の標準の InProc セッション状態プロバイダー セクションを忘れずにコメント アウトしてください。Don’t forget to comment out the standard InProc session state provider section in your 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> -->

これらの手順を実行すると、アプリケーションが Azure Cache for Redis セッション状態プロバイダーを使用するように構成されます。Once these steps are performed, your application is configured to use the Azure Cache for Redis Session State Provider. アプリケーションでセッション状態を使用すると、状態が Azure Cache for Redis インスタンスに格納されます。When you use session state in your application, it is stored in an Azure Cache for Redis instance.

重要

既定のメモリ内の ASP.NET セッション状態プロバイダーに格納できるデータと異なり、キャッシュに格納されるデータは、シリアル化可能である必要があります。Data stored in the cache must be serializable, unlike the data that can be stored in the default in-memory ASP.NET Session State Provider. Redis のセッション状態プロバイダーを使用するときは、セッション状態に格納されるデータ型がシリアル化可能であることを確認してください。When the Session State Provider for Redis is used, be sure that the data types that are being stored in session state are serializable.

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

  • メモリ内のセッション状態プロバイダー: このプロバイダーでは、メモリ内にセッション状態が格納されます。In Memory Session State Provider - This provider stores the Session State in memory. このプロバイダーを使用する利点は、単純で高速なことです。The benefit of using this provider is it is simple and fast. ただし、メモリ内プロバイダーを使用する場合、このプロバイダーは分散型でないため、Web Apps は拡張できません。However you cannot scale your Web Apps if you are using in memory provider since it is not distributed.
  • SQL Server のセッション状態プロバイダー: このプロバイダーでは、SQL Server 内にセッション状態が格納されます。Sql Server Session State Provider - This provider stores the Session State in Sql Server. 永続的なストレージにセッション状態を格納する場合は、このプロバイダーを使います。Use this provider if you want to store the Session state in persistent storage. Web アプリは拡張できますが、セッションに SQL Server を使うと、Web アプリのパフォーマンスに影響を与えます。You can scale your Web App but using Sql Server for Session has a performance impact on your Web App. パフォーマンスを向上させるために、このプロバイダーをインメモリ OLTP 構成で使用することもできます。You can also use this provider with an In-Memory OLTP configuration to help improve performance.
  • Azure Cache for Redis セッション状態プロバイダーなどの分散型メモリ内セッション状態プロバイダー: このプロバイダーを使用すると、両方の長所を活用できます。Distributed In Memory Session State Provider such as Azure Cache for Redis Session State Provider - This provider gives you the best of both worlds. Web アプリで、単純かつ高速で、スケーラブルなセッション状態プロバイダーを使うことができます。Your Web App can have a simple, fast, and scalable Session State Provider. このプロバイダーではセッション状態がキャッシュに格納されるため、一時的なネットワーク障害など、分散型メモリ内キャッシュとの通信時に関するすべての要素をアプリで考慮する必要があります。Because this provider stores the Session state in a Cache, your app has to take in consideration all the characteristics associated when talking to a Distributed In Memory Cache, such as transient network failures. キャッシュの使用に関するベスト プラクティスについては、Microsoft のパターンとプラクティスの「Azure Cloud Application Design and Implementation Guidance (Azure クラウド アプリケーションの設計と実装のガイダンス)」の「キャッシュに関するガイダンス」を参照してください。For best practices on using Cache, see Caching guidance from Microsoft Patterns & Practices Azure Cloud Application Design and Implementation Guidance.

セッション状態とその他のベスト プラクティスの詳細については、 Web 開発に関するベスト プラクティス (Azure を使用した実際のクラウド アプリケーションの構築)に関するページを参照してください。For more information about session state and other best practices, see Web Development Best Practices (Building Real-World Cloud Apps with Azure).

次の手順Next steps

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