题
我相信,我们提出了一些痛苦地明显的失误(s),我无法看见。我希望你可以让我直。
我会管理的工作完全不同之处在于,如果一个用户在一台计算机上输入数据用户开始一届会议上的另一个机会也获取本届会议的信息。不是那么好。:(
我打电话我会这样的:
UserInfo userinfo = UserInfo.Session;
我的会议管理类使用:
static UserInfo userInfo;
static public UserInfo Session
{
get
{
if (userInfo == null)
{
userInfo = new UserInfo();
userInfo.ResetSessionTime();
}
return userInfo;
}
}
我阅读和编写的数据这样的。我意识到我可以列化的整个班级,但这似乎是一个更多的开销序列化和deserialize一整类每次级被称为反对的只是抓住了一个或两个项目我需要的。
Decimal _latitude;
private String SessionValue(String sKey, String sValue, String sNewValue)
{
String sRetVal = "";
if (sNewValue == null)//not wanting to update anything
{
if (sValue == null)//there is no existing value
{
sRetVal = (String)System.Web.HttpContext.Current.Session[sKey];
}
else
{
sRetVal = sValue;
}
}
else
{
System.Web.HttpContext.Current.Session[sKey] = sNewValue;
sRetVal = sNewValue;
}
return sRetVal;
}
public Decimal Latitude
{
get { return SessionValue("Latitude", _latitude); }
set { _latitude = SessionValue("Latitude", _latitude, value); }
}
谢谢你的帮助
解决方案
1)您使用静态为您的UserInfo,这意味着这个类的一个实例是来你的web服务器的所有请求之间共享。
2)你不仅在会话存储的值(这是不用户之间共享的),而且在一个实例变量,在这种情况下,将会用户之间共享。
所以_latitude的值是造成你这个问题。一个简单的解决是这样的:
public class Userinfo
{
public Decimal Latitude
{
get { return System.Web.HttpContext.Current.Session["Latitude"]; }
set { System.Web.HttpContext.Current.Session["Latitude"] = value; }
}
}
一个更好,更可测试的版本将是:
public class UserInfo
{
private HttpSessionStateWrapper _session;
public UserInfo(HttpSessionStateWrapper session)
(
// throw if null etc
_session = session;
)
public Decimal Latitude
{
get { return _session["Latitude"]; }
set { _session["Latitude"] = value; }
}
}
在第二个实例中,请求中你刚构建的 HttpSessionStateWrapper (使用当前会议)并将其传递给用户信息的实例。当你测试,你可以通过在模拟包装。
不管是什么,用户信息的实例应该不会在会话之间共享,它应该写,直接从会话读取。不要试图通过保持你的会话值的本地版本过早优化的事情。您没有保存任何时间,你只是打开自己可达错误。
其他提示
发生这种情况是因为存储用户的信息在一个静态的领域。静态的实例是共享之间的所有请求,以及生活的整个生命周期的应用程序。
换句话说,所有用户将获得相同的用户信息的实例,从UserInfo.会议。
为了解决这个问题,你可以:
- Serialize整个类会议。我不知道哪些其他性质的,你有,但是我猜想它不会被太多的开销。
- 创建一个实例UserInfo每请求,使用户总是读,从一个新的实例,这反过来将会刷新它的价值从会议。
不隶属于 StackOverflow