Идентификатор сеанса ASP.NET не будет обновляться

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

protected void btnRefresh_Click(object sender, EventArgs e)
{

    HttpContext.Current.Session.Abandon();
    HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");
    mycookie.Expires = DateTime.Now.AddDays(-1);
    Response.Cookies.Add(mycookie);
    LblSessionID.Text = HttpContext.Current.Session.SessionID+
        " test btnRefresh_Click";
    LblIsNewSession.Text = Session.IsNewSession.ToString();
}

Но когда кнопка нажата, значение SessionID в LblSessionID по-прежнему отображает старое значение, но другая метка LblIsNewSession покажет его как истинное для IsNewSession. Затем LblSessionID будет отражать фактическое значение SessionID, когда я использую элемент управления asp.net (например, раскрывающийся список), который имеет autopostback="true", и оттуда сохраняется SessionID.

Я использую global.asax

Любая идея, почему LblSessionID ведет себя не так, как должно, и ждет следующей обратной передачи, чтобы начать отражать фактическое значение?

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


person Darcy Q    schedule 30.11.2012    source источник
comment
Идентификаторы сеансов используются повторно, и часто вы будете получать один и тот же идентификатор снова и снова.   -  person CM Kanode    schedule 30.11.2012
comment
Используйте событие session_end файла glabal.asax.   -  person CodeSpread    schedule 30.11.2012


Ответы (4)


Вот как это работает - если вы Abandon сеанс, он не будет отражать это до следующего запроса. Это имеет смысл, если подумать...

Скажем, у вас есть пользователь, который обращается к вашему сайту и получает идентификатор сеанса 123 (я знаю, что это не отражает фактическое значение). Когда вы нажимаете кнопку, чтобы получить новый идентификатор сеанса, запрос пользователя поступает из старого сеанса, и это значение отражается во время этого Request. После того, как сеанс сброшен (или заброшен или что-то еще), пользователь получает новый идентификатор сеанса 321, а последующие Request будут отражать этот новый идентификатор сеанса.

person Dave Zych    schedule 30.11.2012
comment
Спасибо. Ваш ответ имеет очень много смысла. Я все еще не уверен, что не так с моим кодом. Что с этим кодом, который не отправляет запрос и что нужно добавить? - person Darcy Q; 03.12.2012

SessionId ненадежен, если вы действительно не храните что-то (что-либо) в сеансе.

person spender    schedule 30.11.2012

пытаться

   Session.RemoveAll();

    Session.Clear(); 
person Garry    schedule 30.11.2012
comment
Это мало чем поможет — просто удалит все из сессии, но не изменит ID для этого запроса. - person Alexei Levenkov; 30.11.2012
comment
нет, они не запускают новый SessionID, они просто очищают значения сеанса - person Darcy Q; 30.11.2012

Это не ваш код, это задокументированное поведение: "Метод Abandon устанавливает флаг в объекте состояния сеанса, который указывает, что состояние сеанса следует отменить. Флаг проверяется в конце запроса страницы. Поэтому , пользователь по-прежнему может использовать объекты сеанса после вызова метода Abandon. Как только обработка страницы будет завершена, сеанс будет удален." (источник: http://support.microsoft.com/kb/899918)

Метод Abandon() помечает коллекцию сеансов для очистки в конце запроса, но фактически не очищает ее немедленно.

Вы можете либо вызвать методы RemoveAll() или Clear() для мгновенного удаления объектов, либо выполнить вызов Response.Redirect для самой страницы и повторно проверить наличие данных.

person Starbuck3000    schedule 31.01.2014