Сериализация состояния сеанса asp.net - PullRequest
0 голосов
/ 04 июля 2011

У меня есть веб-сайт ASP.NET, использующий «inproc» для управления сессиями на одном сервере.Теперь мне нужно поместить веб-сайт на два сервера в веб-ферме (за средой со сбалансированной нагрузкой).Мы узнали, что режим «inproc» больше не будет работать в среде веб-фермы.Итак, я рассматриваю возможность перехода из режима «inproc» в режим SQL-сервера.Кроме того, я узнал, что это не просто вопрос обновления web.config (конечно, создание базы данных SQL).Так как я сохраняю датированные, определяемые пользователем классы, List, ... в переменные сеанса.Я понимаю, что я должен сделать определяемые пользователем классы как сериализуемые (просто поместите [Serializable] в класс), и .NET позаботится обо всем остальном (мне не нужно явно указывать код для обработки).

Это правильно?А как насчет других «специальных» типов, таких как DataTable, List, как мне сделать их разделяемыми?

Спасибо.

Ответы [ 3 ]

1 голос
/ 04 июля 2011

Это в основном правильно, хотя работа по созданию классов, тестированию всего и т. Д. Не тривиальна. Все, что нужно для хранения в сеансе, должно быть сериализовано, поэтому для «специальных» типов данных вам нужно будет создавать сериализованные версии этих данных. Возможно, вы захотите узнать, почему вы сохраняете таблицы данных в своем состоянии сеанса? Я бы посоветовал вам очень хорошо взглянуть на то, что вы делаете, и сохранить там только минимальное количество - ключи, а не целые объекты.

Мой текущий клиент использует сеанс SQL с большим количеством больших объектов, и он работает медленно, потому что существует необходимость сериализации и десериализации этих больших объектов, а также записи и чтения из БД.

И вы могли бы когда-нибудь в этом понять, почему люди говорят, что переменные сеанса - плохая идея. Масштабируемость является большой проблемой, как от объема работы, которую вы должны сделать сейчас, так и от размера вашего хранилища сеансов sql.

ETA: Как уже говорили другие, проблема с сериализуемостью одинакова для любого типа состояния сеанса.

1 голос
/ 04 июля 2011

Мне также пришлось переключить приложение с InProc на SqlSessionState

  • для DataTable, оно уже сериализуемо 1 .
  • для List<T>, это сериализуемо, если и только если T является Сериализуемым.

Большинство .NET простых типов являются Сериализуемыми.Однако, если вы объявляете и используете свои собственные классы, вы должны объявить их сериализуемыми, чтобы хранить их в сеансе.

tl; dr;Переключите ваше Sessionstate на SqlServer и сериализуйте, пока он не заработает.

Второй тест - обеспечение одинакового контекста шифрования и дешифрования для ваших двух серверов.Пожалуйста, прочитайте http://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.71%29.aspx и убедитесь, что оба сервера используют один и тот же ключ.

0 голосов
/ 04 июля 2011

Чтобы подкрепить комментарий @ AD.Net, если вы смогли сохранить объекты в режиме inProc, не должно быть проблем с сохранением в других режимах применительно к сериализации.

Для объектов, подобных датируемым, выВы увидите, что в соответствии с MSDN эти классы уже помечены как сериализуемые под капотом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...