每个请求都会在会话中添加新项目

时间:2013-10-03 15:05:51

标签: asp.net session

我偶然发现了这种行为,因为我在错误消息中返回会话中的项目数,发现某些会话中有多达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的等效方法。

1 个答案:

答案 0 :(得分:1)

归功于适度的jadarnel27。

事实证明,Ajax Control Toolkit NoBot控件在每次请求时都会在会话中添加一个整数。我的网站有一个自动40秒刷新,类似于Facebook,所以这可能会导致整个事情在某些时候崩溃,我很幸运现在找到它。如果其他人考虑使用NoBot控件,请注意此行为!