コントローラーに属性SessionStateBehavior.ReadOnly
がある場合、このコントローラー内のセッション変数は変更できませんが、値は変更できると思います。
私はこのコードを試します
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class GLobalController : Controller
{
public ActionResult Index()
{
Session["xxx"] = DateTime.Now.ToString();
return View();
}
その投稿は、行動に一貫性がないと主張しています。 ReadOnlyを使用して、コントローラーのセッションに確実に書き込むことができます。
私はそれを次のように扱います:
これは http://msdn.Microsoft.com/en-us/library/system.web.sessionstate.sessionstatebehavior.aspx に対抗していることを理解しています
要求に対して読み取り専用セッション状態が有効になっています。つまり、セッション状態は更新できません。
しかし、実際にはいくつかのシナリオでセッション状態を更新できるようです。
Session Stateエンジンを設計および開発したPatrick Y.Ng(Microsoftのソフトウェアエンジニア)によるとASP.NETの:
EnableSessionStateがReadOnlyとしてマークされていても、InProc状態では、ユーザーはセッションを変更できます。唯一の違いは、リクエスト中にセッションがロックされないことです。この制限は仕様によるものです。また、MSDNに記載されていないことを残念に思います。
この投稿 には、セッション状態に関するより有用な情報があります。それは本当に読む価値があります。
これは私の解釈です。
アクションメソッドの実行中にSession
を追加できることがわかりました。結局のところ、Sessionは実際には単なる辞書です。ただし、セッションは最後に保存されません。
例外をスローする必要があるように見えますが、おそらくこの機能が後でフレームワークに導入されて以来、毎回チェックしないことにしました。
結果は、使用しているセッション状態のストレージ(インプロセス/ SQLサーバー)によっても異なる場合があります。