代码之家  ›  专栏  ›  技术社区  ›  Peter Ruderman

为什么我的ASP.NET MVC应用程序会为一个会话启动多次会话?

  •  8
  • Peter Ruderman  · 技术社区  · 15 年前

    回家.mvc
    <应用程序重新启动>
    获取main.css

    获取somedata.mvc
    ...

    由于应用程序的架构方式,如果您在浏览器窗口中打开应用程序时进行重建,则这种序列会相当频繁地发生。这不会引起太大的关注,除非我在生产环境中也看到了它。例如,当您编辑web.config时会发生这种情况(尽管很少)。

    重启后的请求都是由于主页中的链接或来自JavaScript的AJAX调用引起的。

    我观察到的是.NET并行处理前5个请求。每个这样的请求都会触发Session\u Start事件。短时间后,它会触发Session\u End事件3次。要清楚的是,每个Session\u Start对应于完全相同的Session。它们都具有相同的会话id,并且IsNewSession属性对于所有会话状态对象都为true。此外,会话结束事件 对应于正在终止的会话。会话将与存储在会话状态中的任何数据一起保持。

    3 回复  |  直到 7 年前
        1
  •  4
  •   Peter Ruderman    15 年前

    这个问题的答案是相当直截了当的,尽管这种行为确实令人困惑。

    通常,MVC会在应用程序的会话状态锁上将所有请求同步到应用程序(因为MVC的http模块被标记为需要会话状态)。在我的场景中,应用程序在服务于主页之后重新启动。因此,当进入与主页相关的请求时,该会话id还没有会话状态,请求并行执行。

    我看到5个并行请求,因为我是在XP上开发的,IIS的桌面版本被限制为5个并发请求。由于这些请求中的任何一个都不存在会话状态对象,因此每个请求都会创建一个新的会话状态对象并启动会话。其中四个请求转到MVC操作方法。由于这些请求需要会话状态,.NET尝试在请求完成后将创建的会话状态对象与备份存储同步。

    只有第一次同步才能成功。NET简单地丢弃三个额外的会话状态对象,并为每个对象激发会话结束。NET不会尝试将第五个会话状态对象与备份存储同步,因为它是为标记为需要只读会话状态的异步http模块创建的。

    因此,修复有两个部分:

    (2) 我现在在字典里记下了参考书目。每次Session\u Start处理程序尝试添加会话id时,我都递增该计数;每次Session\u End尝试删除会话id时,我都递减该计数。一旦计数达到0,我就从字典中删除会话id。

        2
  •  1
  •   matt-dot-net    15 年前

    如果客户端向您发送的值已过期,则可以重用会话id。阅读有关<会话状态>元素的regenerateExpiredSessionId属性 here 请注意,默认值为“true”

    你可能还会发现 this

        3
  •  0
  •   Nathan    10 年前

    我在开发一个旧的ASP.NET应用程序时遇到了这种情况-结果是,对于cookies,RequireSSL设置为True。。。当然,这意味着会话cookie不是由客户端保留/重新发布的(localhost,非SSL),因此后续请求创建了新会话。

    推荐文章