У меня есть приложение ASP.NET, которому необходимо запомнить некоторую информацию о пользователе (и из какой он компании) на разных страницах в рамках сеанса.
Я предполагаю, что это требование практически любого приложения ASP.NET определенного размера. Я использовал несколько разных подходов на протяжении многих лет.
В прошлом я передал идентификатор в параметрах строки запроса следующим образом:
site.com/page.aspx?usrid=1&companyid=2
а затем создал экземпляр объекта на каждой странице (из базы данных).
Другой распространенный способ сделать это — сохранить мои объекты в переменных сеанса:
Session["User"] = currentUser; // store at login
User currentUser = (User)Session["User"]; // retrieve on some other page
что экономит поездку в БД, но я беспокоюсь об используемой памяти, если объект пользователя сложный, а на сайте много одновременных пользователей.
Недавно я унаследовал приложение, которое использует общедоступные свойства на главной странице, например:
Master.theUser = currentUser; // store at login
User currentUser = Master.theUser; // retrieve on some other page
Это сохраняет актерский состав и, как мне кажется, выглядит более читабельно, но я не знаю, лучше это или хуже с точки зрения производительности. У него также есть некоторая логика в геттере, где, если частное значение равно нулю, он пытается получить его из переменной Session, хотя я не уверен, что это никогда не использовалось (или использовалось каждый get!? ) или что.
Моя последняя идея - использовать мой класс страницы. У меня есть пользовательский класс страницы, производный от стандартного базового класса System.Web.UI.Page. Он включает такие объекты, как CurrentUser, в качестве общедоступных свойств. Кажется, это работает нормально. Мне это даже больше нравится.
Но я действительно не знаю, что происходит под одеялом. Может ли кто-нибудь дать мнение о том, какой подход лучше и почему?
Альтернативные предложения для этого также приветствуются.
Обновление: я проверил использование trace.axd и Trace.Write, и оказалось, что ни версия мастер-страницы, ни версия пользовательского класса страницы не «запоминают» значения между страницами. В методах "get" есть строка кода, которая проверяет, является ли свойство User пустым, и если да, то считывает его из переменной сеанса. Это происходит, когда страница обращается к свойству (Master.User или производному классу this.User) в первый раз на данной странице, тогда последующие запросы могут получить значение (без обращения к переменной сеанса).