我正在使用以下方法将全局变量保存在单独的类文件中,以便它们可以在少数后端类中传递。问题是当系统在多用户环境中使用时失败。我无法选择“会话”方法,因为管理员尚未准备好在SharePoint服务器上启用会话状态。
static class Global
{
private static string id = string.Empty;
public static string id
{
get { return id; }
set { id = value; }
}
}
如果我从上面的代码中删除静态声明,它会在多用户场景中正常工作吗?如果不向服务器管理员寻求任何帮助,我还有哪些其他选择。
答案 0 :(得分:7)
不要将static
用于每个用户或每个请求的内容; static
在Web应用程序中非常罕见,但有时可能会用于保存整个系统配置的快照(最好是不可变的)。
那么:我们可以在哪里储存东西?
会话状态对于某些事情来说是明显的答案(而且这里是线索)每个会话,但听起来这不是一个选项
除此之外,你基本上有:http请求。这意味着您可以访问表单,查询字符串和cookie。并且就是它。您不希望在cookie中存储太多内容:它会使每个请求都膨胀。而“观点状态”只是邪恶的。如果常规会话状态不可行,你可以根据一些cookie(适当安全)做一些家庭酿造“会话”实现,但坦率地说,我认为你做得很好:
id
答案 1 :(得分:5)
您的静态变量将在所有用户之间共享,并且不属于特定用户。使用静态变量来保持Web环境中的状态几乎总是一个坏主意。
如果您无法启用会话状态,那么一个好的策略是:
这样你基本上可以重新发明会话状态;但是你要避免全局启用会话状态。如果状态足够小,您也可以将其编码为URL。
还要考虑Session状态在服务器场环境中不能正常工作,除非您将其存储在共享服务器上 - 这可能是您的管理员不倾向于启用它的原因。
答案 2 :(得分:2)
在Web场或Web园环境中,静态更糟糕,SharePoint支持得非常好。静态字段是 per-AppDomain 。例如,这意味着它们对于一台机器中的一个工作进程中的所有用户都是相同的,但在工作进程之间和机器之间将是不同的。
不要在多用户应用程序中使用静态,并且在环境发生变化时您不必担心行为的变化。
答案 3 :(得分:1)
如果确实需要会话状态,请启用会话状态。就这么简单。
但是,如果您只需要几个(轻量级)会话变量,那么您就可以使用cookie,并在每次请求时来回传输数据。
您还可以尝试使用以下内容“重新实现”会话状态:
static class Globals
{
private static Dictionary<string, MySessionObjectType> sessions;
public static MySessionObjectType GetSessionData(string SessionID){...}
public static void SetSessionData
(string SessionID, MySessionObjectType sessionData){...}
}
当然,这不会扩展到多个Web服务器,管理会话超时将是PITA。
不要忘记网络本身的性质是无状态的,因此使用太多状态(无论是在服务器上还是在客户端上)并不总是明智的选择。