1

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

4

1 回答 1

1

归功于谦虚的 jadarnel27。

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

于 2013-10-03T18:58:31.407 回答