7

我的 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. 与上述问题之一无关的其他领域仍悬而未决。

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

感谢所有的评论。

4

2 回答 2

7

经过几个月的搜索和调试,我想我们终于得出了一个结论。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\" />");
}
%>
于 2012-06-20T19:10:14.887 回答
0

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

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

他在帖子的最后谈到了这件事。

于 2012-01-25T22:14:48.190 回答