2012-01-25 56 views
7

我有一个In-Proc会话状态的生产问题。MVC3 .NET会话随机丢失会话值并返回为空

我们的应用程序基于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,所以我也发现了关于会话ID或会话重置问题的东西。在某些情况下,我们发现在页面重定向时,它会触发对该方法的两次重复GETS调用,第一次调用缺少sessionID并随机重定向到其中一个服务器(这是因为来自负载均衡器的服务器持久会话是基于客户端IP,会话ID和其他头信息创建独特的会话,以保持客户端在一台服务器上)。当我们的重定向页面使用window.location时,每次都会发生这种情况。

如果bad,no sessionID调用碰到同一台服务器,这将导致客户端的“Object reference not set ..”问题。 (这可能是因为没有sessionID的第一次错误调用导致应用程序创建覆盖原始会话对象的新会话)因此,即使在正确的sessionID传递到应用程序的第二个调用中,我们也会发现session对象包含null 。

所以我相信有重复调用清除会话对象的问题,它不知道为什么或者是什么原因造成的。

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

更新: 我们计划采取这些步骤,希望能够解决此问题。

  1. 我们在制作异步Ajax调用的地方存在问题,所以我们打算删除异步功能并让它同步运行Ajax。
  2. 我们遇到了Windows.location的JavaScript重定向发生的问题。我们已经创建了一个使用回传的替代方法,希望能够解决这个问题。
  3. 其他与上述问题无关的区域仍然悬而未决。

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

感谢您的所有意见。

+0

不信任会话超时。如果服务器需要更多内存,它将释放会话。我有一个小时的工作时间,大多数人在20分钟之前会休会,有时会在5-10分钟之内。 (它是一台拥有69Gbs内存的机器,而且流量不是很大......) – H27studio

+0

我的公司一直在为此挠头,即使在使用'inproc'进行'elmah'等测试之后...... –

+2

@ H27studio,你有没有参考“如果服务器需要更多的内存,它将释放会话”? –

回答

5

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

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

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

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

更新:从Sitecore的 响应:

Sitecore的CMS被设计为与ASP.NET的WebForms技术的使用。在使用网页表单时,机器人检测依赖于页面中的控件。很自然,你不能在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\" />"); 
} 
%> 
0

我认为你的问题可能是你引入的异步ajax调用。我最近阅读了David Hayden撰写的一篇文章,讨论了在同一会话中并发ajax请求的问题导致问题。无论如何,这是需要看的东西。希望它有帮助。

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

他就在帖子的末尾谈到它。

+0

当启用会话状态时,Ajax请求不会引起问题,它们只会在服务器上一个接一个地执行以防止并行访问。这是一个性能问题,与OP会议中消失的问题无关。 – Jan

+0

我读过这篇文章,并认为这也可能是一个问题,但正如Jan所说。如果处于读/写状态,会话状态应该锁定。因此,并发的ajax请求只需要按顺序执行。不应该破坏会话。即使这将是原因,我认为它会发生在一个恒定的基础上,而不是随机的间隔。但这是我不太自信的一个领域,也许有人有一个很好的方法来验证这是否是问题?谢谢 –

+0

性能问题是的,但他也提到会议可能会腐败,这就是我提出的原因。只是想帮助。 – Perry