我偶然发现了这种行为,因为我在错误消息中返回会话中的项目数,发现某些会话中有多达120个项目(它们应该有1个!)。在进一步调查中,我发现每个请求似乎都在会话中添加了一个项目。它们都是负整数,如-710,-140 -528。我似乎无法看到出现的数字模式。
我已经检查了我的代码与Session对象的任何交互,据我所知,它不是我。我在会话中存储了一个项目,这是我自己的对象,上面有许多其他属性。我的会话状态是SQL服务器,我只是序列化了一组需要保留的值。
有没有人见过这样的内容,或者对我可以进一步排查的地方有任何建议?
提前谢谢。
- 根据要求编辑 - 首先计算会话中的项目 - 这是在我的母版页的页面加载事件中完成的。我循环,所以我可以使用调试器进行检查。
int itemCount = Session.Count;
for (int i = 0; i < itemCount; i++)
{
object o = Session[i];
}
- 这是我将自定义对象添加到会话的位置。这在会话开始和我的母版页中调用。它运行在“获取,但如果不存在,创建”原则。
HttpSessionState Session = HttpContext.Current.Session;
HttpRequest Request = HttpContext.Current.Request;
if (Session == null)
return null;
SessionData sessionData = (SessionData)Session[StaticNames.SESSION_NAME];
if (sessionData == null)
{
sessionData = new SessionData();
Session.Add(StaticNames.SESSION_NAME, sessionData);
}
我也有这个从会话中获取SessionData对象:
public SessionData(SerializationInfo info, StreamingContext ctxt)
{
this.IsManualLogin = (bool)info.GetValue("IsManualLogin", typeof(bool));
this.HasAskedUserForLocation = (bool)info.GetValue("HasAskedUserForLocation", typeof(bool));
// ... etc, more items for all users here
int? loginID = null;
try
{
loginID = info.GetInt32("LoginID");
}
catch
{
return;
}
this.LoginID = loginID.Value;
// ... etc, more items for logged in users only
}
还有一种将此数据添加到用于SqlSessionState的SerializationInfo的等效方法。
答案 0 :(得分:1)
归功于适度的jadarnel27。
事实证明,Ajax Control Toolkit NoBot控件在每次请求时都会在会话中添加一个整数。我的网站有一个自动40秒刷新,类似于Facebook,所以这可能会导致整个事情在某些时候崩溃,我很幸运现在找到它。如果其他人考虑使用NoBot控件,请注意此行为!