【问题标题】:MVC3 .NET Session randomly losing session value and is return as nullMVC3 .NET Session 随机丢失会话值并返回为 null
【发布时间】:2012-02-19 02:53:18
【问题描述】:

我的 In-Proc 会话状态存在生产问题。

我们的应用程序基于 MVC 3 .NET 框架,并集成到我们运行 Sitecore CMS 的站点中。

我们的用户在整个应用程序流程中随机遇到“对象引用未设置为对象实例”。

经过大量的日志记录和跟踪,我们可以得出结论,这是由于会话对象返回 null 造成的。

这里有一些关于我们发现和知道的细节。

  1. 会话 ID 对同一用户保持不变并通过了所有 正确进入应用程序的方式。
  2. 我认为这不是代码问题,因为这只在生产环境中随机发生,绝不会在本地、开发或暂存环境中发生。
  3. 有两个生产服务器通过负载平衡器运行。
  4. 不是服务器持久性问题,因为我们通过休眠其中一台服务器并将所有流量路由到一台服务器进行了测试。此外,通过日志记录,我们可以识别出该用户正在访问同一台服务器,但会话已变为空。
  5. 这似乎也不是客户端问题,因为即使之前遇到错误,他们也能够成功通过应用程序。
  6. 这似乎不是流量负载或服务器负载问题,因为它在一天中的随机时间发生,并且在此期间发生在随机用户身上。
  7. 这似乎不是回收应用程序池造成的。
  8. 这似乎不是由会话超时引起的,因为我们已将超时设置为两小时,并且在我们跟踪日志时,用户可能会在 5-10 分钟内体验到流程。

旁注:由于我们的 Sitecore CMS,我们必须使用 In-Proc 会话状态。所以改变设计不是一种选择。

我有一个理论,它可能与会话锁定或因并发访问尝试而损坏有关。

在我们的应用程序中我们经常看到这个问题发生的几个地方是当用户被 javascript (windows.location) 重定向时。

以及在进行异步 ajax 调用的区域。

我们对此一直摸不着头脑,我想知道是否有人对可能出现的问题有任何见解或理论?

谢谢

补充说明:

@Mystere && @H27Studio,所以我还发现了一些与 sessionID 或会话重置问题有关的东西。在某些情况下,我们发现在页面重定向上它会触发对该方法的两次重复的GETS调用,第一次调用缺少sessionID并随机重定向到其中一个服务器(这是因为来自负载均衡器的服务器持久会话是基于客户端 IP、sessionID 和其他标头信息来创建唯一会话以将客户端保持在一台服务器上)。当我们的重定向页面使用 window.location 时,每次在流程中都会发生这种情况。

如果错误的、没有 sessionID 调用击中同一服务器,这将导致客户端出现“未设置对象引用..”问题。 (这可能是因为第一个没有 sessionID 的错误调用导致应用程序创建一个覆盖原始会话对象的新会话)所以即使在第二次调用正确的 sessionID 传递给应用程序时,我们也会发现会话对象包含 null .

所以我认为清除会话对象的重复调用存在问题,不确定原因或原因导致该对象开始。

有人知道这件事吗?谢谢

更新: 我们正计划采取这些措施来解决这个问题。

  1. 我们在进行 Async Ajax 调用的区域存在问题,因此我们计划移除 Async 功能并让它与 Ajax 同步运行。
  2. 我们遇到了发生 Windows.location javascript 重定向的问题。我们创建了一种使用回发的替代方法,希望能解决该领域的问题。
  3. 与上述问题之一无关的其他领域仍悬而未决。

一旦我们将其部署到生产环境中,就会发布更改的效果。

感谢所有cmets。

【问题讨论】:

  • 不信任会话超时。如果服务器需要更多内存,它将释放会话。我有 1 小时的工作时间,但大多数人仍然会在 20 分钟之前放松训练,有时会在 5 到 10 分钟。 (而且它是一台具有 69Gbs 内存的机器,而且流量并不多......)
  • 即使在elmah 使用inproc 登录等之后,我的公司也一直在为此摸不着头脑...
  • @H27studio,你有没有参考“如果服务器需要更多内存,它将释放会话”?
  • Bte,您确定负载均衡器不会在高负载时间将用户从一台服务器发送到另一台服务器吗?听起来确实如此。
  • @Mystere Man 和 @@H27studio,我已经添加了关于您的评论的附加说明。感谢 cmets

标签: .net asp.net-mvc-3 session sitecore inproc


【解决方案1】:

经过几个月的搜索和调试,我想我们终于得出了一个结论。 Sitecore Analytics Robots 会话超时似乎存在错误。我们首先注意到,每当随机会话丢失是由于会话提前超时,然后我们注意到这些会话被设置为 1 分钟超时而不是 120 分钟。

搜索完所有配置文件后,我们注意到 Sitecore Analytic.Robots.SessionTimeout 是唯一设置为 1 分钟的超时值。

通过增加这个值,它解决了我们的会话超时问题。

因此,根本问题是 Sitecore Analytics 错误地将某些访问者会话识别为机器人会话,并将其超时重新分配为 1 分钟。这可能是一个需要报告的错误。

更新: Sitecore 的回复:

Sitecore CMS 旨在与 ASP.NET WebForms 技术一起使用。在使用 Web 表单时,机器人检测依赖于页面中的控件。不能在 ASP.NET MVC 应用程序中使用它是很自然的,但是有一个简单的解决方案 - 将以下代码放入元素中:

<%
if (Context.Diagnostics.Tracing || Context.Diagnostics.Profiling)
{
  Response.Write("<!-- Visitor identification is disabled because debugging is active. -->");
}
else if (Tracker.IsActive && (Tracker.Visitor.VisitorClassification == 925))
{
  Response.Write("<link href=\"/layouts/System/VisitorIdentification.aspx\"    rel=\"stylesheet\" type=\"text/css\" />");
}
%>

【讨论】:

    【解决方案2】:

    我认为您的问题可能是您所暗示的 Async ajax 调用。我最近阅读了 David Hayden 的一篇文章,其中谈到了在同一会话中并发 ajax 请求导致问题的问题。无论如何,这是值得一看的。希望对您有所帮助。

    http://davidhayden.com/blog/dave/archive/2011/02/09/SessionLessControllersMvc3.aspx

    他在帖子末尾谈到了这件事。

    【讨论】:

    • Ajax 请求不会引起问题,它们只会在启用会话状态时在服务器上一个接一个地执行以防止并行访问。这是一个性能问题,与会话消失的 OP 问题无关。
    • 我已经阅读了这篇文章,并认为这也可能是一个问题,但正如 Jan 所说。如果处于读/写状态,会话状态应该被锁定。因此,并发 ajax 请求只需按顺序执行即可。不应该破坏会话。即使这是原因,我认为它会在一个恒定的基础上而不是随机间隔上发生。但这是我不太自信的一个领域,也许有人有一个好方法让我验证这是否是问题所在?谢谢
    • 性能问题是的,但他也提到会话可能会损坏,这就是我提出它的原因。只是想帮忙。
    • 是的,但是当控制器上启用会话状态时,ASP.NET 通过序列化异步调用来保护会话状态不被破坏。
    • 我现在明白了。在发布之前应该多吸收一下这篇文章。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2016-09-23
    • 2020-11-26
    • 2017-02-04
    • 2015-09-05
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多