4

我正在使用以下方法将全局变量保存在单独的类文件中,以便它们可以在几个后端类之间传递。问题是当系统在多用户环境中使用时它会失败。我不能选择“会话”方法,因为管理员还没有准备好在 SharePoint 服务器上启用会话状态。

static class Global
{
        private static string id = string.Empty;
        public static string id
        {
            get { return id; }
            set { id = value; }
        }
}

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

4

4 回答 4

7

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

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

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

除此之外,您基本上还有:http 请求。这意味着您可以访问表单、查询字符串和 cookie。就是这样。您不想在 cookie 中存储太多:它会膨胀每个请求。而“viewstate”就是邪恶的。如果常规会话状态不可行,您可以基于一些 cookie(适当安全)做一些自制的“会话”实现,但坦率地说,我认为你会做得很好:

  • 如果您想要的只是一个,请使用请求表单/查询字符串id
  • 否则推动您的管理员启用会话状态
于 2013-02-13T21:09:29.297 回答
5

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

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

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

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

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

于 2013-02-13T21:09:46.420 回答
2

在 SharePoint 很好地支持的网络场或网络花园环境中,静态可能会更糟。静态字段是per-AppDomain。这意味着,例如,对于一台机器内的一个工作进程内的所有用户,它们将是相同的,但在工作进程之间以及机器之间将是不同的。

不要在多用户应用程序中使用静态,并且您不必担心随着环境的变化而发生的行为变化。

于 2013-02-13T21:49:43.657 回答
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。

不要忘记 Web 本身的本质是无状态的,因此使用过多的状态(无论是在服务器上还是在客户端上)并不总是一个明智的选择。

于 2013-02-13T21:17:54.143 回答