web-dev-qa-db-ja.com

コントローラSessionStateBehaviorはReadOnlyであり、セッション変数を更新できます

コントローラーに属性SessionStateBehavior.ReadOnlyがある場合、このコントローラー内のセッション変数は変更できませんが、値は変更できると思います。

私はこのコードを試します

 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    public class GLobalController : Controller
    {
      public  ActionResult Index()
        {
            Session["xxx"] = DateTime.Now.ToString();
            return View();
        }
29
user1223234

参照 MVC 3+の読み取り専用セッションへの書き込み

その投稿は、行動に一貫性がないと主張しています。 ReadOnlyを使用して、コントローラーのセッションに確実に書き込むことができます。

私はそれを次のように扱います:

  • 必須とは、セッションに排他ロックを要求していることを意味します(つまり、同じセッションIDに対する要求の並列処理はありません)
    • ReadOnlyは、セッションに非排他的ロックを要求していることを意味します(つまり、要求は、排他的ロックのある要求が完了するまで待機する必要がありますが、非排他的ロックのある要求を並行して処理できます。ただし、これはユーザーの責任ですコードがセッションに書き込まないこと。フレームワークによって必ずしも強制されるわけではありません)

      これは http://msdn.Microsoft.com/en-us/library/system.web.sessionstate.sessionstatebehavior.aspx に対抗していることを理解しています

      要求に対して読み取り専用セッション状態が有効になっています。つまり、セッション状態は更新できません。

      しかし、実際にはいくつかのシナリオでセッション状態を更新できるようです。

  • 29
    turnhose

    Session Stateエンジンを設計および開発したPatrick Y.Ng(Microsoftのソフトウェアエンジニア)によるとASP.NETの:

    EnableSessionStateがReadOnlyとしてマークされていても、InProc状態では、ユーザーはセッションを変更できます。唯一の違いは、リクエスト中にセッションがロックされないことです。この制限は仕様によるものです。また、MSDNに記載されていないことを残念に思います。

    この投稿 には、セッション状態に関するより有用な情報があります。それは本当に読む価値があります。

    4
    piter entity

    これは私の解釈です。

    アクションメソッドの実行中にSessionを追加できることがわかりました。結局のところ、Sessionは実際には単なる辞書です。ただし、セッションは最後に保存されません。

    例外をスローする必要があるように見えますが、おそらくこの機能が後でフレームワークに導入されて以来、毎回チェックしないことにしました。

    結果は、使用しているセッション状態のストレージ(インプロセス/ SQLサーバー)によっても異なる場合があります。

    0
    Simon_Weaver