что происходит с session_start в global.asax, если время ожидания сеанса? - PullRequest
2 голосов
/ 01 февраля 2011

У меня есть многодоменное веб-приложение, которое обрабатывает пользователей по-разному в зависимости от URL-адреса, который они используют.

Я использую Session ["data"] для хранения информации о пользователе и запускаю этот сеанс с Session_Start ["data"] вGlobal.asax.

Все отлично работает, но я хотел бы знать, что происходит после бездействия.После определенного времени сеанс будет тайм-аутЕсли это произойдет, будет ли Global.asax рассматривать это как нового пользователя и снова запустит Session_Start для этого пользователя?

И будет ли Session ["data"] обновляться при каждой загрузке / перезагрузке страницы?Или потому, что он запускается только один раз и истекает через какое-то точное время?

Я пытался сделать этот вопрос как можно более ясным.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Сеанс будет обновляться / поддерживаться при каждом попадании на сервер этого пользователя. Вы устанавливаете тайм-аут в файле веб-конфигурации, и это скользящее значение, поэтому он перезапускается снова при каждом запросе сервера.

что-то вроде этого:

<configuration>
  <sessionstate 
      mode="inproc"
      cookieless="false" 
      timeout="20" />
</configuration>

Когда время сеанса истечет, при следующем запросе будет запущен Session_Start.Если вы обращаетесь к Session [data] из любого места в коде, вы должны убедиться, что оно не равно null, поскольку оно выдаст исключение NullReferenceException, если время сеанса истекло и вы пытаетесь получить к нему доступ.

2 голосов
/ 01 февраля 2011

Новый сеанс начинается, когда пользователь впервые посещает URL-адрес .NET (например, страницу .aspx, но не HTML-файл или другой статический файл) на вашем сайте.Этот сеанс длится до истечения времени ожидания или до тех пор, пока приложение не будет уничтожено (перезапущено / аварийно завершено / переработано).Время ожидания .NET по умолчанию составляет 20 минут;таким образом, сеанс будет длиться до тех пор, пока пользователь продолжает нажимать на страницы .aspx без перерывов более 20 минут.

В течение этого времени вы можете хранить информацию в объекте Session, который относится к этому пользователю.По сути, это хеш-таблица, которую вы можете заполнить объектами, для которых вы определяете ключи.В вашем случае вы используете Session ["data"], но вы можете использовать любой ключ, который вам действительно нужен.

Однако сеанс и данные, хранящиеся в хеш-таблице Session, очень хрупки (см.все способы он может умереть выше).Вы не должны полагаться на это, чтобы сохранить что-то важное, что не может быть легко восстановлено (например, в Session_Start).Таким образом, он действительно выполняет две роли: поддержание состояния (так что вы знаете, что это все тот же пользователь от страницы к странице);и как пользовательский кеш, где вы можете хранить данные в памяти для более быстрого выполнения действий.

Session_Start запускается один раз за сеанс - по определению.Если вам нужно идентифицировать одного пользователя в нескольких сеансах, вам нужно будет использовать что-то более постоянное, например, установить свой собственный файл cookie с истечением в далеком будущем.Вы можете поместить идентификатор в такой файл cookie, который позволит вам узнать, что это пользователь 12345 (фактически, Session_Start - это просто место для поиска вашего «постоянного» файла cookie и соединения ваших данных об этом существующем пользователе с этим новым сеансом).

И если вы хотите хранить данные о пользователе, который пережил несколько сеансов, вам придется хранить его где-то более постоянным - база данных является наиболее очевидным решением.Когда они возвращаются, вы можете кэшировать некоторые из этих данных в хеш-таблице Session - и Session_Start - это просто место для этого.Надеюсь, это поможет.

0 голосов
/ 09 мая 2013

Защищено void Session_Start (отправитель объекта, EventArgs e) { // код, который запускается при запуске нового сеанса

    string RootURL = Request.ApplicationPath;
    if (!RootURL.EndsWith("/"))
        RootURL += "/";
    Globals._rootURL = RootURL;
}
...