必要に迫られてAPS.NETのセッション管理をRedis(Azure Cache for Redis)を使う手順を検証してみました。
環境
- VisualStudio Community 2022
- .NET Framework 4.7.2
WebForm1.aspx
プログラムとしては、サンプル的にFormにUserNameとEmailをSessionに入れるだけのものを作ってみました。確認のためページロード時にLabelへ代入して現在の値を表示しています。UI側は省略します。
WebForm1.aspx.vb
Imports System.Reflection.Emit
Public Class WebForm1
Inherits Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If Not Session("UserName") Is Nothing Then
lbUserName.Text = Session("UserName")
End If
If Not Session("Email") Is Nothing Then
lbPassword.Text = Session("Email")
End If
End Sub
Protected Sub Button1_Click(sender As Object, e As EventArgs)
Session("UserName") = tbUserName.Text
Session("Email") = tbEmail.Text
Response.Redirect("WebForm1.aspx")
End Sub
Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Session.Abandon()
Response.Redirect("WebForm1.aspx")
End Sub
End Class
普通に動きます。特に何も設定していないのでSessionはInProc(ローカルに格納されている)状態になっているかと思います。これだと複数サーバーで動かした時にセッションが共有されないので、Redisを使えうように変更します。
Azure側
-
Azure Cache for Redisのインスタンスを作成
- テスト目的なのでBasic C0で作成
- 実際のところセッションキャッシュ利用でどのレベルが必要かは不明
- 個人的にはキャッシュであればBASIC C1(1GB 1000接続)くらいで十分かと
- 設定で特に迷いそうな部分無し
- アクセス可能になるまで10-20分かかる(長い
- 情報ソースは古いがそのまま動く
- テスト目的なのでBasic C0で作成
プログラム側
- プロジェクトを右クリックして「NuGetパッケージの管理」から
Microsoft.Web.RedisSessionStateProvider
を追加
- web.configに以下のsessionState情報を追加
- hostは設定したもの、accessKeyは管理画面から取得できます
※下記のテンプレートは自動追加されませんでした
<configuration>
<system.web>
....
<sessionState mode="Custom" customProvider="MySessionStateStore">
<providers>
<add name="MySessionStateStore"
type="Microsoft.Web.Redis.RedisSessionStateProvider"
host="xxxxx.redis.cache.windows.net"
port="6380"
accessKey="xxxxxx"
ssl="true" />
</providers>
</sessionState>
</system.web>
...
<configuration>
これで同じように動作するのを確認します。普通に動けば設定はOKなはずです。動作していない場合や設定が誤っている場合は、タイムアウトしてエラーページが表示されます。
ぶつぶつ
プログラム自体は変更することなく、Nugetでセッションプロバイダーの追加をして設定を書くだけで、Redis側に移りました。Redis側の設定も必要無く簡単でした。
気になる点
- Redisのコネクション数は同時? Session管理だけの時は少なくて良い?
- 保存された値によるとTimeOutは20分(1200sec)
- Redis固有でなくHttpSessionState.Timeoutの値の模様
参考