ASP.NET Server Side Viewstate - PullRequest
       9

ASP.NET Server Side Viewstate

3 голосов
/ 19 марта 2009

Я прочитал несколько подходов к хранению viewstate на сервере:

Вот один

Вот еще

Но они довольно сложные. Я ищу способ сохранить объект без необходимости его сериализации. Я мог бы использовать состояние сеанса, но если пользователь открывает более одного окна, могут быть перезаписаны объекты.

Есть ли простое решение для этого?

Ответы [ 3 ]

2 голосов
/ 19 марта 2009

Я ищу способ сохранения объекта без его сериализации.

Будь осторожен с этим. Это сильно повлияет на использование памяти вашего сайта, и использование памяти часто является самым большим препятствием для масштабируемости.

2 голосов
/ 19 марта 2009

В этой ситуации я бы поместил объект хранилища в сеанс с использованием уникального ключа и привязал ключ к странице. Все это можно абстрагировать в свойства класса страницы.

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) для автоматического удаления устаревших записей из памяти, но это имеет свои собственные предостережения.

Следует отметить, что предупреждения Джоэла относительно его ответа об использовании памяти абсолютно точны. Возможно, это не лучшая идея для сценариев с малым объемом памяти, интенсивным использованием или объектами с большим постоянством.

1 голос
/ 19 марта 2009

Назначьте номер каждому окну, которое может открыть пользователь. Добавьте этот номер к ключу сеанса. Вам также следует сохранить номер где-нибудь на странице (строка запроса или скрытый ввод), чтобы можно было извлечь соответствующую переменную сеанса.

...