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 はどういうときに使うの?ってあたりをまとめたいなーと思っています・・・いずれは・・・。