【问题标题】:static class instances unique to a request or a server in ASP.NET?ASP.NET 中请求或服务器独有的静态类实例?
【发布时间】:2010-09-26 16:43:51
【问题描述】:
 public sealed class UserLoginSingleton
{

     UserLoginCollection _userLoginCol = new UserLoginCollection();

    UserLoginSingleton()
    {
    }

    public static UserLoginSingleton Instance
    {
        get
        {
            IDictionary items = HttpContext.Current.Items;
            if (!items.Contains("TheInstance"))
            {
                items["TheInstance"] = new UserLoginSingleton();

            }
            return items["TheInstance"] as UserLoginSingleton;
        }
    }


    public void CreateUserObj(string xmlData)
    {
        _userLoginCol = (UserLoginCollection)_xmlUtil.Deserialize(xmlData, typeof(UserLoginCollection));
    }

    public UserLoginCollection getUserObj()
    {
        return _userLoginCol;
    }
}

用法:

第1页.aspx

UserLoginSingleton.Instance.CreateUserObj(xml);

Pase2.aspx:

用户登录集合 用户登录集合 = UserLoginSingleton.Instance.getUserObj();

在此处关注文章: link text

我在第 1 页中设置了我的集合对象,然后执行 response.redirect 或单击链接以将我转到第 2.aspx 页。但是,我的单例实例没有我设置的集合对象。如何在每个会话的不同页面中持久保存我的集合对象?

我知道静态不会起作用,因为每个实例都会看到该对象,我希望每个用户都有特定的对象。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    HttpContext.Items 集合是按请求进行的。因此,在您的情况下,当用户被重定向到 page2.aspx 时,您在第 1 页上创建的实例就消失了。要使同一实例在请求中可用,您需要使用 HttpContext.Session 来存储您的实例。

    【讨论】:

      【解决方案2】:

      静态字段在请求之间共享。注意标准的多线程问题!

      HttpContext 实例不在请求之间共享。

      【讨论】:

      • 在给出的示例中,他没有使用任何静态字段。
      • 对。如果他想要共享数据(他似乎想要),他应该使用静态字段。
      • 他希望在每个用户的请求之间共享它。静态字段绝对不是他想要的。 :)
      【解决方案3】:

      也许我需要重新考虑我想做什么。基本上,我的集合是围绕下拉列表的不同值的集合。这是由客户端提供的,我的网页需要显示它。

      我认为客户端可以将其作为序列化数据发送给我,我给了他们 xsd,他们会在登录时将其异步发送给我。第 1 页将接收序列化数据。登录页面会将他们登录。一旦 page1 收到数据,将反序列化为我的强类型集合,该集合又将用于在 page2.aspx 中构建下拉列表

      我为什么要以如此原始的方式来做。我的双手受到限制,如果可以避免的话,我会尽量不使用会话状态来持有这个对象。

      每个用户登录都带有下拉列表的各种选项。用户 1 可以有 10 个选项,用户 2 可以有 200 个选项。

      【讨论】:

      • 如果你想避免 Session 用于网络农场场景,我建议使用 ASP.NET 状态服务器,或者更新数据库中的表(由登录 ID 键入)。跨度>
      【解决方案4】:

      只是指出你的单例实现是错误的,你的单例应该这样声明

      public sealed class Singleton
      {
          static readonly Singleton instance=new Singleton();
      
          // Explicit static constructor to tell C# compiler
          // not to mark type as beforefieldinit
          static Singleton()
          {
          }
      
          Singleton()
          {
          }
      
          public static Singleton Instance
          {
              get
              {
                  return instance;
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        使用读取 HttpSession 而不是静态变量的静态方法:

        
        public class UserLoginController
        {
            public static UserLoginController Instance
            {
                get
                {
                    HttpSession session = HttpContext.Current.Session;
                    if (session["UserLoginController"] == null)
                    {
                        session["UserLoginController"] = new UserLoginController();
                    }
                    return session["UserLoginController"] as UserLoginController;
                }
            }
        }
        
        

        【讨论】:

          猜你喜欢
          • 2020-05-02
          • 1970-01-01
          • 1970-01-01
          • 2019-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-29
          • 2017-07-19
          相关资源
          最近更新 更多