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