关于C#:ASP.NET中请求或服务器特有的静态类实例?

static class instances unique to a request or a server in ASP.NET?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 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

1
UserLoginSingleton.Instance.CreateUserObj(xml);

PASE2.ASPX:

UserLoginCollection
userLoginCollection =
UserLoginSingleton.Instance.getUserObj();

文章如下:链接文本

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

我知道Static不会工作,因为每个实例都会看到对象,我希望它针对每个用户。


HttpContext.Items收集是按请求进行的。因此,在您的例子中,当用户被重定向到page2.aspx时,您在第1页上创建的实例就不存在了。为了让同一个实例跨请求可用,您需要使用HttpContext.Session来存储您的实例。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
        }
    }
}


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
        }
    }
}

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

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

我为什么要这么原始地做呢?我的手被限制所束缚,如果我能避免这个对象,我就不想用会话状态来保存它。

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


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

请求之间不共享httpContext实例。