Static Vs多用户环境中的公共变量

Ris*_*shi 4 .net c# sharepoint

我正在使用以下方法将全局变量保存在单独的类文件中,以便它们可以在少数后端类中传递.问题是当系统在多用户环境中使用时失败.我无法选择"会话"方法,因为管理员尚未准备好在SharePoint服务器上启用会话状态.

static class Global
{
        private static string id = string.Empty;
        public static string id
        {
            get { return id; }
            set { id = value; }
        }
}
Run Code Online (Sandbox Code Playgroud)

如果我从上面的代码中删除静态声明,它会在多用户场景中正常工作吗?如果不向服务器管理员寻求任何帮助,我还有哪些其他选择.

Mar*_*ell 7

不要static用于每个用户或每个请求的东西; static在Web应用程序中非常罕见,但有时可能会用于保存整个系统配置的快照(最好是不可变的).

那么:我们在哪里可以存放东西?

会话状态将是每个会话(并且这里是线索)的明显答案,但听起来这不是一个选项

除此之外,你基本上有:http请求.这意味着您可以访问表单,查询字符串和cookie.而就是这样.您不希望在cookie中存储太多内容:它会使每个请求都膨胀.而"观点状态"只是邪恶的.如果常规会话状态不可行,你可以根据一些cookie(适当安全)做一些家庭酿造"会话"实现,但坦率地说,我认为你做得很好:

  • 如果你想要的只是一个,请使用请求表单/查询字符串 id
  • 否则推动您的管理员启用会话状态


dri*_*iis 5

您的静态变量将在所有用户之间共享,并且不属于特定用户.使用静态变量来保持Web环境中的状态几乎总是一个坏主意.

如果您无法启用会话状态,那么一个好的策略是:

  • 将用户特定标识符添加到URL,并将其保留在URL中
  • 根据该ID,将您的状态保存在数据库中的服务器上

这样你基本上可以重新发明会话状态; 但是你要避免全局启用会话状态.如果状态足够小,您还可以将其编码到URL中.

还要考虑Session状态在服务器场环境中不能正常工作,除非您将其存储在共享服务器上 - 这可能是您的管理员不倾向于启用它的原因.