我使用自定义SessionWrapper类来处理ASP.NET项目中的Session。看起来不错,但我最近发现它有一个搞笑的错误。如果许多用户登录我的网站,他们的会话将被交换或混合。用户A将具有用户B的会话,并且用户C可能具有用户A的会话。用户刷新页面后可能会更改。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections;
namespace MyNamespace
{
public class SessionWrapper
{
public static string USER_SESSION = "userSession";
public static void SetUserSession(string email, Dictionary<int, DateTime> products)
{
UserSession userSession = new UserSession() { Email = email, Products = products };
System.Web.HttpContext.Current.Session.Add(USER_SESSION, userSession);
}
public static UserSession GetUserSession()
{
if (System.Web.HttpContext.Current.Session[USER_SESSION] != null)
{
return System.Web.HttpContext.Current.Session[USER_SESSION] as UserSession;
}
return null;
}
public static void RemoveUserSession()
{
if (System.Web.HttpContext.Current.Session[USER_SESSION] != null)
{
System.Web.HttpContext.Current.Session.Remove(USER_SESSION);
}
}
}
public class UserSession
{
private string email;
private Dictionary<int, DateTime> products = new Dictionary<int, DateTime>();
public string Email
{
get;
set;
}
public Dictionary<int, DateTime> Products
{
get;
set;
}
}
}
答案 0 :(得分:3)
除了Jonas H注意到的应用程序中的一些奇怪代码之外,唯一的原因是你在一个浏览器实例中的单独选项卡或同一个浏览器的两个实例中进行测试强>
尝试显示HttpContext.Current.Session.SessionID以确定您是否在所有情况下都处于同一会话中。
答案 1 :(得分:0)
尝试添加锁定语义:
private static Object locker = new Object();
public static UserSession GetUserSession()
{
lock( locker)
{
if (System.Web.HttpContext.Current.Session[USER_SESSION] != null)
{
return System.Web.HttpContext.Current.Session[USER_SESSION] as UserSession;
}
return null;
}
}
答案 2 :(得分:0)
这是“静态”修饰符。静态变量存在于它们创建的AppDomain的生命周期中。
即。 w3wp.exe应用程序进程生成进程本身运行的应用程序域。无论当时正在回答哪个请求。
因此,您的静态变量可以由一个用户设置,并且可以读入另一个用户会话以及如何进行此设置。
答案 3 :(得分:0)
您正在使用相同的密钥添加所有会话:USER_SESSION。您需要为每个用户(可能是电子邮件地址)提供唯一的密钥。
答案 4 :(得分:0)
提供的代码应该按照需要运行。如果问题确实如上所述存在,则必须由应用程序中的其他地方的代码引起。