我有大量的应用程序页面是在别处开发的,并且有一个共同的模式通过它们运行,我认为应该是一个实例变量被声明为静态变量。
更详细的问题陈述是:如果我有两个Web会话a和b在同一个应用程序池中的同一个iis服务器上运行,如果访问有问题的页面并将静态变量x设置为value1然后b访问同一页面并将静态变量x设置为值2,我的理解是value1已被值2替换。我的困境是在代码中重复使用此模式,代码似乎在高级别工作。结论是运气(会话中的时间a在会话b发生之前已经放弃了对变量的需求)或者还有其他事情发生。
我愿意接受有关c#细微差别或开发人员错误的建议。
答案 0 :(得分:3)
静态属性/字段在Web应用程序中很好,只要它们用于随时可以接受的共享数据,例如应用程序池回收时。
尽管如此,他们的值确实在ASP.Net应用程序中共享,除非他们有一个隔离的支持机制,如Session
。
public static int UserId = 10; // BAD! everyone gets/sets this field's value
// BAD! everyone gets/sets this property's implicit backing value
public static int UserId {
get;
set;
}
// This case is fine; just a shortcut to avoid instantiating an object.
// The backing value is segregated by other means, in this case, Session.
public static int UserId{
get{
return (int)HttpContext.Current.Session["UserId"];
}
}
// While I would question doing work inside a property getter, the fact that
// it is static won't cause an issue; every call retrieves data from a
// database, not from a single memory location.
public static int UserId{
get{
// return some value from database
}
}
在流量显着之前,您可能看不到问题。假设页面检索值,将其放入静态变量,使用一次,然后完成执行。如果页面快速执行,除非时间正确和/或流量足够高,否则您可能看不到非常小(但危险!)的重叠窗口。
这可能会导致难以诊断的错误,因为它们依赖于时间,并且在您自己在本地计算机上进行测试时可能看不到它们。