ASP.NET MVC - SessionStateAttribute と SessionStateBehavior その2

前回に続き SessionStateAttribute についてです。

今回は、SessionStateAttribute に SessionStateBehavior のそれぞれを指定した場合にセッションの動きがどうなるか、実際に試してみました(まぁ実際に知りたかったのは ReadOnly と Disabled の2つですが)。

SessionStateAttribute によるセッションの動き

SessionStateBehavior ごとの SessionStateAttribute を指定した場合の動きを以下にまとめてみます。セッション状態モードは、ASP.NET 状態サービスで確認しています。

Default と Required

まずは次のコントローラを作成しました。

[SessionState(SessionStateBehavior.Default)]
public class SampleController : Controller {
    public ActionResult First() {
        Session["message"] = "Hello!";

        return RedirectToAction("second");
    }

    public ActionResult Second() {
        // Hello!
        return Content((string)Session["message"]);
    }
}

First メソッドにアクセスするとセッションにメッセージを書き込み、Second メソッドにリダイレクト。Second メソッドではセッションからメッセージを読み込んでいます。・・・普通ですね。

前回書いたとおりですが、SessionStateAttribute を指定しない場合や Required を指定した場合も同じ動きになります。

ReadOnly

今度は、先ほどのコントローラ(微妙に違いますが)でセッションを読み取り専用にします。

[SessionState(SessionStateBehavior.ReadOnly)]
public class SampleController : Controller {
    public ActionResult First() {
        // 例外がスローされるわけではない
        Session["message"] = "Hello!";

        // Hello!
        var message = (string)Session["message"];

        return RedirectToAction("second");
    }

    public ActionResult Second() {
        // null
        return Content((string)Session["message"]);
    }
}

First メソッドでは、セッションへの書き込み時に例外がスローされるのかなと思っていましたが、そうではないようです。

セッションに書き込んだ直後に読み出すと更新されているように見えますが、その後、Second メソッドでは、Session["message"]はnullとなり、セッションが更新されていないことがわかります。

Disabled

Disabled を指定すると、Session プロパティが null になりました。

[SessionState(SessionStateBehavior.Disabled)]
public class SampleController : Controller {
    public ActionResult Test() {
        // Sessionプロパティはnull
        return Content(Session == null
            ? "Session is null"
            : "Session is not null");    // Session is null
    }
}

おまけ

SessionStateAttribute はどういうときに使うの?ってあたりをまとめたいなーと思っています・・・いずれは・・・。