【问题标题】:Problem with static field in asp.net web-siteasp.net网站中的静态字段问题
【发布时间】:2011-07-07 22:17:15
【问题描述】:

我目前正在开发一个 ASP.NET 网站。在我的一个页面中,我有一个用于当前登录用户的 CompanyId 的静态字段。

private static Guid _CompanyId = Company.Get().CompanyId;

Company.Get() 返回有关当前登录用户的公司的信息,其中 UserId 使用以下方式检索:

System.Web.Security.Membership.GetUser();

但是当以另一个用户身份登录时,在另一家公司中,Company.Get().CompanyId 将返回来自第一家公司的 Guid。

我是否错过了使用静态字段的要点,还是有其他原因? 我通过将代码隐藏中对 _CompanyId 的所有引用替换为 Company.Get().CompanyId 来修复它以进行快速修复,但这并不是真正的很好的解决方案。

【问题讨论】:

    标签: c# .net asp.net


    【解决方案1】:

    静态变量值在应用程序级别持续存在,因此在用户范围内存在。您应该使用 session 来存储您的信息。静态变量值在您重新分配值、应用程序重新启动等之前不会更改。

    【讨论】:

      【解决方案2】:

      您应该使用 HttpContext.Current 来存储会话级变量。静态变量对 Web 应用程序中的所有会话可见。

      【讨论】:

      • 使用 HttpContext.Current.Session 存储每个用户,每个会话变量。同意,静态变量对当前服务器上的所有用户都是可见的。在 webfarm 环境中,将变量存储在 HttpContext.Current.Items 集合中将不允许该数据与用户一起传送到场中的另一台服务器。
      • 静态变量不会随用户移动,但可以使用进程外会话存储在网络场中的服务器之间共享会话。 Microsoft Velocity (msdn.microsoft.com/en-us/data/cc655792.aspx) 正在成为出色的分布式缓存解决方案。
      • 但是这个解决方案安全吗?我需要加密内容吗? CompanyId 不得更改
      【解决方案3】:

      从您的字段定义中删除 static 应该会给您所需的内容。

      【讨论】:

      • 谢谢,但我正在寻找解释为什么它不起作用。
      • 我不这么认为,使字段即时(非静态)并不能解决问题,因为即使在会话级别也不会持久化
      猜你喜欢
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 2019-06-05
      • 2023-02-15
      • 1970-01-01
      相关资源
      最近更新 更多