3

我已经阅读了一些在服务器上存储视图状态的方法:

这是一个

这是另一个

但它们有点复杂。我正在寻找一种无需序列化即可持久化对象的方法。我可以使用会话状态,但如果用户打开多个窗口,则可能会覆盖对象。

有一个简单的解决方案吗?

4

3 回答 3

2

我正在寻找一种无需序列化即可持久化对象的方法。

小心点。这将对您站点的内存使用产生巨大影响,而内存使用通常是可扩展性的最大障碍。

于 2009-03-19T16:20:11.923 回答
2

在这种情况下,我会使用唯一键将对象存储在会话中,并将键绑定到页面。所有这些都可以抽象为页面类的属性。

public string PersistanceKey
{
    get { 
        if(ViewState["PersistanceKey"] == null)
           ViewState["PersistanceKey"] = "Object" + Guid.NewGuid().ToString();

        return (string)ViewState["PersistanceKey"];
    }
}

public PersistanceObject Persistance
{
    get {
        if(Session[this.PersistanceKey] == null)
            Session[this.PersistanceKey] = new PersistanceObject();

        return (PersistanceObject)Session[this.PersistanceKey];
}

不同的会话密钥将允许在每页的基础上使用不同的对象。或者,您可以考虑使用应用程序缓存(Cache 对象)来自动从内存中删除陈旧的条目,而不是使用 Session 对象,但这有其自身的警告。

应该注意的是,乔尔对他关于内存使用的回答的警告是完全准确的。对于低内存、高使用率或大持久性对象场景,这可能不是最佳主意。

于 2009-03-19T16:41:23.370 回答
1

为用户可能打开的每个窗口分配一个编号。将该数字附加到会话密钥。您还应该将数字存储在页面中的某处(查询字符串或隐藏输入),以便能够检索适当的会话变量。

于 2009-03-19T16:18:43.550 回答