我有一个自定义ASP.NET会话管理器类,如下所示:
public sealed class SessionManager : Page
{
private const string USER = "User";
private static readonly SessionManager _instance = new SessionManager();
private SessionManager()
{
}
public static SessionManager Instance
{
get { return _instance; }
}
public User User
{
get { return Session[USER] as User; }
set { Session[USER] = value; }
}
}
用户成功登录系统后,主页上会显示其全名。以下是我面临的问题:
1)我首先登录系统,因为John和John的全名显示在主页上,相应的用户对象保持在会话中。
2)现在从另一台PC上我以Mark身份登录系统。现在,Mark的全名显示在主页上,相应的用户对象保持在会话中。
3)现在,当我访问John已登录的PC并刷新主页时,我看到了Marks的名字,而不是Johns的名字。
这种奇怪行为可能是什么原因?
答案 0 :(得分:2)
您的类继承自System.Web.UI.Page,它在首次访问时将其Session成员设置为HttpContext.Current.Session。由于您有一个单例,它将始终引用访问User属性的第一个会话。
您可能应该这样做:
public sealed class SessionManager
{
private const string USER = "User";
private static readonly SessionManager _instance = new SessionManager();
private SessionManager()
{
}
public static SessionManager Instance
{
get { return _instance; }
}
public User User
{
get { return HttpContext.Current.Session[USER] as User; }
set { HttpContext.Current.Session[USER] = value; }
}
}