ASP.NET のセッション情報の格納先は、オンプレでは StateServer モードを使うことが多いと思う (InProc は使わない前提)。
オンプレではステートサービスを利用する方法で良いが、Azure Web Apps 上で動作させる場合、ステートサービスが利用できない。
代替案として、Azure リソースの一つである Azure Redis Cache が利用できる。
Azure Redis Cache 自体は ASP.NET のセッション情報格納用に用意されているわけではなく、純粋に NoSQL DB として用意されているが、ASP.NET のセッション格納先として利用できる Microsoft.Web.RedisSessionStateProvider NuGet ライブラリが用意されていて、ASP.NET Web アプリ開発側としてはそこまで特殊な操作は必要ない。
Redis Cache の設定を動的に変更する
Redis Cache をセッションの格納先に使用する場合、host, port, accessKey や databaseId などの設定は、基本的には web.config で設定することになる。
web.config による設定で問題ないプロジェクトであれば良いが、Azure Web Apps で ASP.NET を動かす場合、スロットを使用して本番とステージングで環境を分け、本番デプロイはスワップを使用する事が多いと思う。
この場合、web.config のみで対応すると、本番スワップ後に本番用の web.config 設定に手動で切り替える必要があり、変更の手間や間違える可能性が出てくる。
その為、Redis Cache の設定についてもアプリ設定などから環境ごとの設定を読み込み、その設定を自動で適用出来るのが望ましい。
使用しているのがセッションという比較的低レベルの場所の為、操作できるタイミングは多くないが、以下のように Global.asax の Application_Start イベントであれば、動的に設定を行うことが出来る。
protected void Application_Start()
{
...
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/SessionState");
ProviderSettings ps = sessionStateSection.Providers[0];
ps.Parameters["host"] = "アプリ設定から取得した設定等";
}
※ なお、この記事の内容とは直接関係ないが、設定値に問題があるなどして上記処理でエラーが発生すると、ASP.NET 的に致命的なエラーの状態になりやすいので、注意
参考情報