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 メソッドを見てもらうとわかると思います。

aspnetwebstack/src/System.Web.Mvc/DefaultControllerFactory.cs at master · ASP-NET-MVC/aspnetwebstack · GitHub

まとめ

MVC では次の3つの場合はセッションの読み書きができることになります。

  • SessionStateAttribute を指定しない場合
  • SessionStateAttribute を Default で指定した場合
  • SessionStateAttribute を Required で指定した場合

実際は Default と Required を指定することはないのかなと思うのですが、どうなんでしょうね。