控制器SessionStateBehavior是ReadOnly,我可以更新会话变量

时间:2012-09-04 12:02:52

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

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

我试试这段代码

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

3 个答案:

答案 0 :(得分:28)

请参阅Writing to a read only session in MVC 3+

该帖子声称行为不一致。 我绝对能够使用ReadOnly写入控制器中的Session。

我会这样对待它:

  • 必需表示您正在请求会话的独占锁定(即不对同一会话ID的请求进行并行处理)
  • ReadOnly意味着您正在请求会话的非独占锁定(即您的请求仍然必须等待具有独占锁定的请求才能完成,但您可以并行处理具有非独占锁定的请求。您应该确保您的代码不会写入会话。它不一定是由框架强制执行的)

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

    相反
      

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

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

  • 答案 1 :(得分:1)

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

      

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

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

    答案 2 :(得分:0)

    这只是我的解释:

    我看到你可以在动作方法中添加Session - 所有Session真的只是一个字典。但是会话最后没有保存。

    它似乎应该抛出一个异常,但也许因为这个功能后来发布到框架中,所以每次都决定不进行检查。

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