我遇到了In-Proc会话状态的生产问题。
我们的应用程序基于MVC 3 .NET框架,并集成到我们运行Sitecore CMS的网站中。
我们的用户在应用程序流程中随机地遇到“对象引用未设置为对象的实例”。
在广泛的日志记录和跟踪之后,我们可以得出结论,这是在会话对象返回null时引起的。
这是关于我们发现的和我们所知道的一些细节。
附注:由于我们的Sitecore CMS,我们必须使用In-Proc会话状态。因此,改变设计不是一种选择。
我有一个理论,它可能与会话锁定或因并发访问尝试而被破坏。
在我们的应用程序中,我们看到很多地方出现了这个问题,当用户被javascript(windows.location)重定向时。
在正在进行异步ajax调用的区域。
我们一直在摸不着头脑,我想知道是否有人会对这个问题有什么见解或理论?
谢谢
添加注意:
@Mystere&& @ H27Studio,所以我也发现了一些与sessionID或会话重置问题有关的内容。在某些情况下,我们发现在页面重定向上它会触发对方法的两次重复GETS调用,第一次调用缺少一个sessionID并随机地重定向到一个服务器(这是因为来自负载均衡器的服务器持久会话是基于客户端IP,sessionID和其他头信息创建唯一会话以将客户端保留在一个服务器上)。当我们的重定向页面使用window.location时,每次在流程中都会发生这种情况。
如果bad,no sessionID调用命中同一服务器,这将导致客户端出现“Object reference not set ..”问题。 (这可能是因为没有sessionID的第一个错误调用导致应用程序创建一个覆盖原始会话对象的新会话)所以即使在正确的sessionID传递到应用程序的第二次调用中,我们也会发现会话对象包含null
所以我认为重复调用存在问题,即清除会话对象,而不确定导致该问题开始的原因或原因。
任何人都有这方面的线索?感谢
更新 我们计划采取这些措施来解决这个问题。
一旦我们将其部署到生产环境,就会发布更改的效果。
感谢所有评论。
答案 0 :(得分:5)
经过数月的搜索和调试,我想我们终于得出了结论。 Sitecore Analytics机器人会话超时似乎存在错误。我们首先注意到,每当随机会话丢失是由于会话过早结束时,我们注意到这些会话被设置为1分钟超时而不是120分钟。
在搜索完所有配置文件后,我们注意到Sitecore Analytic.Robots.SessionTimeout是唯一设置为1分钟的超时值。
通过增加此值,它解决了我们的会话超时问题。
因此,根本问题是Sitecore Analytics错误地将某些访客会话识别为机器人会话并将其超时重新分配给1分钟。这可能是一个要报告的错误。
<强>更新强> 来自Sitecore的回复:
Sitecore CMS旨在与ASP.NET WebForms技术一起使用。使用Web表单时,bot检测依赖于页面中的控件。很自然,你不能在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\" />");
}
%>
答案 1 :(得分:0)
我认为您的问题可能是您所支持的Async ajax调用。我最近阅读了David Hayden撰写的一篇文章,该文章讨论了同一会话中并发ajax请求导致问题的问题。无论如何都要看。希望它有所帮助。
http://davidhayden.com/blog/dave/archive/2011/02/09/SessionLessControllersMvc3.aspx
他在帖子结束时谈到了这一点。