我已经阅读了一些对服务器上存储视图状态:

这里是一个

这里是另一个

但他们那种复杂。我正在寻找一种方式来坚持的目标,而无需序列化。我可以使用会话状态,但如果用户打开多个窗口,有可能是该对象的覆盖。

是否有一个简单的解决这个?

有帮助吗?

解决方案

在这种情况下,我愿意把存储采用了独特的密钥在会话对象和领带的关键页面。所有这些都可以被抽象成在页面类的属性。

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];
}

在不同的会话密钥将允许在每个页面的基础不同的对象。或者,而不是使用Session对象,你可以考虑使用应用程序缓存(Cache对象)来自动删除过时的条目出来的内存,但是这有它自己的警告。

应该指出的是,乔尔对他的内存使用情况的答案警告是完全准确。这可能不是对于低存储器,高使用率,或者大持久性对象场景个好主意。

其他提示

  

我要寻找一种方法来持续的对象,而无需将其序列化。

小心那。这将会对内存使用你的网站产生巨大的影响,并且内存的使用往往是最大的障碍的可扩展性。

号码指定给每个窗口的用户可能会打开。追加这个数字的会话密钥。你也应该在一些地方保存页面(查询字符串或隐藏输入)的数量,以便能够检索适当的会话变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top