Переменная, хранящаяся в Session, десериализуется один или несколько раз в течение жизненного цикла страницы? - PullRequest
6 голосов
/ 27 января 2010

Я хотел бы обернуть переменные сеанса способом, подобным тому, который обсуждался в CodeProject .

public static class WebSession
{
  private const string CurrentUserKey = "CurrentUser";

  private static HttpSessionState Session
  {
    get { return HttpContext.Current.Session; }
  }

  public static bool Exists
  {
    get { return Session != null; }
  }

  public static User CurrentUser
  {
    get { return Session[CurrentUserKey] as User; }
    set { Session[CurrentUserKey] = value; }
  }
}

Вот мой вопрос: если бы мне пришлось обращаться к CurrentUser несколько раз на одной и той же странице, получу ли я улучшение производительности, назначив его локальной переменной вместо доступа к свойству обертывания? Или HttpSessionState гарантирует, что объект десериализуется только один раз за запрос, чтобы последующие вызовы в том же http-запросе больше не стоили?

Спасибо, Aaron

Ответы [ 4 ]

6 голосов
/ 28 января 2010

В каждом запросе имеется копия вашего состояния сеанса в памяти. Поэтому единственная стоимость, которую вы бы сэкономили, локально копируя переменную сеанса, - это приведение от Object к вашему типу. Затем копия в памяти добавляется в сеанс в конце запроса.

Будет ли Session сериализирован и десериализован на странице, зависит от того, какого Session Provider вы выберете. Для состояния сеанса In-proc сериализация не выполняется. Для серверов сеансов объект должен быть сначала сериализован.

4 голосов
/ 28 января 2010

Есть копия в памяти. Вы получаете незначительное улучшение производительности от кэширования значения; это сохранит только поиск по словарю, который будет слишком быстрым, чтобы его заметить, если вы не выполняете его миллион раз за загрузку страницы.

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

Я только что задал вопрос об этой же вещи: Являются ли когда-либо неявно создатели свойств .Net?

3 голосов
/ 28 января 2010

Я проделал некоторую работу, разбирая сессию недавно , и, как я мог видеть, весь объект состояния десериализовывается один раз и только для каждого запроса. Конечно, это достаточно легко проверить - просто извлеките его дважды и проверьте ReferenceEquals.

Конечно, размещение значения в поле между использованиями сэкономило бы некоторое время на поиск, но вы должны оплатить стоимость десериализации только один раз.

Если вы действительно хотели быть уверены, вы также можете проверить это дважды, внедрив ISerializable и записав сериализованные / десериализованные вызовы.

0 голосов
/ 28 января 2010
...