【问题标题】:Controller SessionStateBehavior is ReadOnly and I can update Session Variable控制器 SessionStateBehavior 是只读的,我可以更新会话变量
【发布时间】:2012-09-04 12:02:52
【问题描述】:

我希望如果控制器具有属性 SessionStateBehavior.ReadOnly 那么我不能更改此控制器内的会话变量 但我可以改变价值观。

我试试这个代码

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

【问题讨论】:

标签: asp.net asp.net-mvc session-variables


【解决方案1】:

Writing to a read only session in MVC 3+

该帖子声称该行为不一致。 我绝对可以使用 ReadOnly 写入控制器中的会话。

我会这样对待它:

  • 必需表示您正在请求对 Session 的独占锁定(即,不对相同 sessionID 的请求进行并行处理)
  • ReadOnly 表示您正在请求 Session 上的非排他锁(即您的请求仍然必须等待具有排他锁的请求完成,但您可以并行处理具有非排他锁的请求。但是它取决于您确保您的代码不会写入 Session。它不一定由框架强制执行)

    我意识到这与http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatebehavior.aspx 背道而驰

    为请求启用了只读会话状态。这意味着无法更新会话状态。

    但似乎您实际上可以在某些情况下更新会话状态。

  • 【讨论】:

    【解决方案2】:

    据设计和开发 ASP.NET 会话状态引擎的 Patrick Y. Ng(Microsoft 软件工程师)说:

    即使 EnableSessionState 被标记为 ReadOnly,在 InProc 状态下,用户仍然可以修改会话。唯一的区别是在请求期间会话不会被锁定。此限制是设计使然。很抱歉,它没有在 MSDN 中记录。

    this post 中有更多关于会话状态的有用信息。真的很值得一读。

    【讨论】:

    • 感谢分享,它解释了很多。
    【解决方案3】:

    这只是我的解释:

    我看到您可以在操作方法期间添加到Session - 毕竟 Session 真的只是一个字典。但是会话最后没有保存。

    看起来它确实应该抛出异常,但也许因为这个特性后来出现在框架中,他们决定不每次都检查。

    结果也可能因您使用的会话状态存储(inproc / sql server)而异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 2023-03-05
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多