.net - MVC3 .NET session 随机丢失 session 值并返回为空

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

我有一个 In-Proc session 状态的生产问题。

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

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

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

以下是有关我们发现的内容和我们所知道的内容的一些详细信息。

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

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

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

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

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

    我们在这方面摸索了一段时间,我想知道是否有人对可能的问题有任何见解或理论?

    谢谢

    补充说明:

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

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

    所以我相信清除 session 对象的重复调用存在问题,它不确定为什么或导致它开始的原因。

    任何人都有这方面的线索?谢谢

    更新:
    我们计划采取这些步骤,希望能解决这个问题。
  • 我们在进行 Async Ajax 调用的区域存在问题,因此我们计划删除 Async 功能并让它与 Ajax 同步运行。
  • 我们遇到了 Windows.location javascript 重定向发生的问题。我们已经创建了一种使用回发的替代方法,希望能解决该领域的问题。
  • 与上述问题之一无关的其他领域仍然悬而未决。

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

    感谢所有的评论。

    最佳答案

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

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

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

    所以根本问题是 Sitecore Analytics 错误地将某些访问者 session 识别为机器人 session 并将其超时重新分配为 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\" />");
    }
    %>
    

    关于.net - MVC3 .NET session 随机丢失 session 值并返回为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9010900/

    相关文章:

    node.js - 通过用户网格身份验证防止共享 session

    c# - 显示 EDT 而不是 EST 的时区转换

    C# 4 位数据类型

    asp.net-mvc-3 - 从 jquery ajax 将复杂对象传递给 asp.net MVC 中的 Action

    c# - 区域特定登录页面

    session - EntityManager.getReference 是否总是在 session 中返回相同的实例?

    .net - 在 Visual Studio 中构建时有条件地使用 32/64 位引用

    .net - 如何让 WinForm 设计器完全忽略自定义控件上的属性?

    MySQL Connector - LINQ to Entities 无法识别该方法

    php - 测试 Symfony2 session