33

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

我试试这段代码

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

3 回答 3

31

请参阅在 MVC 3+ 中写入只读会话

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

我会这样对待它:

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

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

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

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

  • 于 2012-09-05T01:26:59.893 回答
    13

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

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

    在这篇文章中有更多关于会话状态的有用信息。真的很值得一读。

    于 2018-08-03T08:26:47.820 回答
    0

    这只是我的解释:

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

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

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

    于 2017-11-27T09:14:56.730 回答