【问题标题】:MVC.net session gets mixed between usersMVC.net 会话在用户之间混合
【发布时间】:2011-01-20 00:44:41
【问题描述】:

我将用户对象存储在会话中,将它们拉出控制器,有时还会将一些数据写入其中。但是当用户同时发帖时,由于某种原因,会话会变得混杂。

有人知道这怎么可能吗?

典型帖子:

  [HttpPost]
    public ActionResult Index(QuestionModel model, FormCollection collection)
    {
        var person = ((Person)Session["Person"]);
        if (!ModelState.IsValid)
        {
            ModelState.Clear();
            ModelState.AddModelError("", Global.Global.error);
            return View(new QuestionModel(person.page, (CultureInfo)Session["culture"]));
        }
        person.page = model.Page;
        while (person.Answers.Count > model.Page - 1)
        {
            person.Answers.RemoveAt(person.Answers.Count - 1);
        }
        var answer = new Answer() { answer = model.ChosenAnswer, Question = "Q" + person.page };
        person.Answers.Add(answer);
        if (!CheckForNextPage(person.page)) { person.hasFinishedQuestions = true; return RedirectToRoute("Result"); }
        person.page++;
        return View(new QuestionModel(person.page, (CultureInfo)Session["culture"]));
    }

我在每个页面上都回显会话 ID,当几个用户使用该网站时,他们会得到彼此的会话 + 会话 ID ...

@update: 3位有经验的开发者找了2天,还是没有解决。已经删除了大约 95% 的代码,仍然是同样的问题。服务器发回来自另一个会话的响应

【问题讨论】:

  • Application_AcquireRequestState session is shared between users 的可能副本 - 编辑您的原件而不是制作新的。
  • 我没有在这里使用 Application_AcquireRequestState。我从该函数中删除了代码,但我仍然需要知道它是否与 @jfar 两者有关:非常有建设性,尽管有 2 个不同的问题具有相同的结果
  • 我无法发布我的代码,大约有 20.000 行......你对什么代码感兴趣
  • @Nealv - 我不明白。您删除了代码,但您想知道它是否与两者有关?
  • 关闭了上一个问题作为欺骗,所以请没有人投票关闭作为欺骗这个问题。至于发生这种情况的原因......它不应该。绝不。我猜你在代码的其余部分中使用了静态。您不应该在您希望由不同会话使用的任何对象中将任何东西标记为“静态”。

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


【解决方案1】:

这是不可能的。 所以这是我的猜测: 您错误地对此进行了测试,您正在使用来自同一浏览器的不同选项卡。 有些人不知道这不会创建不同的会话。

尝试在 2 个不同的浏览器(即 firefox 和 chrome)上对此进行测试,因为它们不会共享会话(因为会话 ID 通常存储在 cookie 中)。

如果是这种情况,请报告。

【讨论】:

  • 我们同时在 3 台不同计算机上的 2 个浏览器中进行测试。我们有 0 个静态变量,我唯一能想到的就是我将链接到会话的变量发布到我的模型中(尽管这不应该是一个问题) View(new QuestionModel(person.page, (CultureInfo)会话[“文化”]));
  • 更奇怪的是,在上面的函数中,我发布了我的数据,当我查看标题时,我得到了 ASP.NET_SessionId=s5ckrnnzezuijcivhfnqxg45 ,它被发回了。当我回显我的响应会话 ID 时,我得到了其他人.....,当我再次点击帖子时,我的会话恢复了。好像一切正​​常,但我得到的回应是别人的
  • 此外,有时值得切换到“私人浏览”或“匿名浏览”模式(名称取决于浏览器),这将确保任何持久会话 id cookie 都不会出现在比赛中。
  • 在这种奇怪的情况下,我会在整个解决方案中使用“在文件中搜索”搜索我的项目,并为此字符串“Session[^\[]”使用正则表达式,这将避免当您仅访问 Session 变量时向您显示所有结果。我会浏览一下结果,看看你在会话中是否有一些奇怪的事情。像一些自定义会话提供程序等。
  • 这个答案的语气不是很有帮助。说这是不可能的。 让发帖者处于一种奇怪的境地,感觉自己很愚蠢,不得不为自己辩护。我们谈论的是软件——甚至像 ASP.NET 这样的专业框架软件也可能(并且确实)包含错误。该网站旨在帮助人们找到解决问题的方法,即使是奇怪的、罕见的、不可能的问题。
【解决方案2】:

我们“解决”了它。我们实际上并没有解决它,但我们将所有源代码复制到一个新项目中,重新编译,一切正常。直到今天,我们仍然不知道为什么,以及这个错误是如何发生的......

【讨论】:

  • 很高兴知道这行得通,尽管它当然是一个非常规的修复方法 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
相关资源
最近更新 更多