ASP.NET MVC - SessionStateAttribute と SessionStateBehavior
先日、SessionStateAttribute クラスを知りました。コントローラに SessionStateAttribute を指定すると、コントローラ内でのセッションの振る舞いを制御できるようです。たとえば、セッションを読み取り専用にするとか。
SessionStateAttribute クラス (System.Web.Mvc)
このクラスのコンストラクタには SessionStateBehavior を渡します。SessionStateBehavior のメンバーは次の4つです。そのうちの下3つは想像がつくのですが、Default って何?と思ったので少し調べてみました。
- Default
- Required
- ReadOnly
- Disabled
SessionStateBehavior 列挙体 (System.Web.SessionState)
Default の動き
まず、MSDNには次のようにあります。
既定の ASP.NET ロジックを使用して、要求のセッション状態の動作を決定します。 既定のロジックは、IHttpHandler に存在するマーカー セッション状態インターフェイスを検索します。
どういうことかというと、リクエストを処理する HTTP ハンドラーが、
- IRequiresSessionState インターフェイスを実装していれば、セッションは読み書き可能になる
- IReadOnlySessionState インターフェイスを実装していれば、セッションは読み取り専用になる
ということです。
MVC における HTTP ハンドラーは MvcHandler です。この MvcHandler は IRequiresSessionState を実装しています。つまり、Default の場合、コントローラはセッションの読み書きができることになります。
MvcHandler クラス (System.Web.Mvc)
IRequiresSessionState インターフェイス (System.Web.SessionState)
また、コントローラに SessionStateAttribute を指定しない場合も、この Default と同じ動きになります。DefaultControllerFactory の GetControllerSessionBehavior メソッドを見てもらうとわかると思います。
まとめ
MVC では次の3つの場合はセッションの読み書きができることになります。
- SessionStateAttribute を指定しない場合
- SessionStateAttribute を Default で指定した場合
- SessionStateAttribute を Required で指定した場合
実際は Default と Required を指定することはないのかなと思うのですが、どうなんでしょうね。