ASP.NET: сессия.Изменения сеанса между запросами
почему собственность SessionID на сессии-объект в ASP.NET-изменение страницы между запросами?
У меня есть такая страница:
...
<div>
SessionID: <%= SessionID %>
</div>
...
и выход продолжает меняться каждый раз, когда я нажимаю F5, независимо от браузера.
12 ответов:
Это причина
при использовании состояния сеанса на основе файлов cookie, ASP.NET не выделяет хранилище для данных сеанса, пока не будет использован объект сеанса. В результате для каждого запроса страницы создается новый идентификатор сеанса, пока не будет получен доступ к объекту сеанса. Если приложению требуется статический идентификатор сеанса для всего сеанса,можно либо реализовать метод Session_Start в глобальном приложении.asax и хранить данные в объекте Session исправить идентификатор сеанса или можно использовать код в другой части приложения для явного хранения данных в объекте сеанса.
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx
Так что в принципе, если вы не получите доступ к объекту сеанса на бэкэнде, новый sessionId будет генерироваться с каждым запросом
EDIT
этот код должен быть добавлен в файл Global.асакс. Он добавляет запись в объект сеанса, поэтому вы фиксируете сеанс до его истечения.
protected void Session_Start(Object sender, EventArgs e) { Session["init"] = 0; }
есть еще одна, более коварная причина, почему это может произойти даже тогда, когда объект сеанса был инициализирован, как показано Cladudio.
в Интернете.конфиг, если есть
<httpCookies>
запись, которая имеет значениеrequireSSL="true"
но вы на самом деле не используете HTTPS: для конкретного запроса, то cookie сеанса не отправляется (или, может быть, не возвращается, я не уверен, что), что означает, что вы в конечном итоге с совершенно новой сессии для каждого запроса.Я нашел это трудно способ, потратив несколько часов на то, чтобы вернуться и вперед между несколькими коммитами в моем исходном контроле, пока я не нашел, какое конкретное изменение нарушило мое приложение.
в моем случае я понял, что cookie сеанса имел домен что входит
www.
префикс, в то время как я был запрашивая страница неwww.
.
Добавлениеwww.
к URL сразу же исправлена проблема. Позже я изменил домен cookie на.mysite.com
вместоwww.mysite.com
.
используя ответ Невилла (удаление requireSSL = true, в интернете.config)и немного изменив код Джоэла Этертона, вот код, который должен обрабатывать сайт, который работает как в режиме SSL, так и в режиме без SSL, в зависимости от пользователя и страницы (я возвращаюсь в код и еще не тестировал его на SSL, но ожидаю, что он должен работать - будет слишком занят позже, чтобы вернуться к этому, так что вот он:
if (HttpContext.Current.Response.Cookies.Count > 0) { foreach (string s in HttpContext.Current.Response.Cookies.AllKeys) { if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid") { HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection; } } }
моя проблема была в том, что у нас был этот набор в интернете.конфигурации
<httpCookies httpOnlyCookies="true" requireSSL="true" />
это означает, что при отладке в non-SSL (по умолчанию) файл cookie auth не будет отправлен обратно на сервер. это будет означать, что сервер будет отправлять новый файл cookie auth (с новым сеансом) для каждого запроса обратно клиенту.
исправление заключается в том, чтобы либо установить requiressl в false в интернете.config и true в интернете.освобождать.настройка или включение SSL в то время как отладка:
другая возможность, которая заставляет SessionID меняться между запросами, даже когда session_onstart определен и / или сеанс был инициализирован, заключается в том, что имя хоста URL содержит недопустимый символ (например, подчеркивание). Я считаю, что это IE specific (не проверено), но если Ваш URL, скажем,
http://server_name/app
, то IE заблокирует все куки и ваша информация о сеансе не будет доступна между запросами.фактически, каждый запрос будет разворачивать отдельный сеанс сервер, поэтому, если ваша страница содержит несколько изображений, тегов скриптов и т. д., тогда каждый из этих запросов GET приведет к другому сеансу на сервере.
дополнительная информация: http://support.microsoft.com/kb/316112
моя проблема была с приложением IPTV Microsoft MediaRoom. Оказывается, что приложения MPF MRML не поддерживают файлы cookie; изменение для использования сеансов cookieless в интернете.конфиг решил мою проблему
<sessionState cookieless="true" />
вот действительно старая статья об этом: Cookieless ASP.NET
в моем случае это происходило в средах разработки и тестирования. После попытки все вышеперечисленные решения без какого-либо успеха я обнаружил, что я смог исправить эту проблему, удалив все сеансовые куки. Расширение веб-разработчика делает это очень легко сделать. Я в основном использую Firefox для тестирования и разработки, но это также произошло во время тестирования в Chrome. Исправление также работало в Chrome.
Мне еще не приходилось делать это в производственной среде и иметь не поступало никаких сообщений о том, что люди не могут войти в систему. Это также произошло только после того, как куки-файлы сеанса были защищены. Это никогда не случалось в прошлом, когда они не были в безопасности.
в моем случае это было потому, что я изменял сеанс после перенаправления из шлюза во внешнее приложение, поэтому, поскольку я использовал IP вместо localhost в этом url-адресе страницы, он фактически считался другим веб-сайтом с разными сеансами.
в резюме
обратите больше внимания, если вы отлаживаете размещенное приложение на IIS вместо IIS express и смешиваете свою машину http://Ip и http://localhost на разных страницах
убедитесь, что у вас нет тайм-аута сеанса, который очень короткий, а также убедитесь, что если вы используете сеансы на основе файлов cookie, которые вы принимаете сеанс.
FireFox webDeveloperToolbar полезен в такие моменты, как это, как вы можете видеть куки, установленные для вашего приложения.
сброс идентификатора сеанса может иметь много причин. Однако любое упомянутое выше не относится к моей проблеме. Поэтому я опишу его для дальнейшего использования.
в моем случае новый сеанс, созданный по каждому запросу, привел к бесконечному циклу перенаправления. Действие перенаправления происходит в OnActionExecuting событие.
также я очищал все заголовки http (также в OnActionExecuting событие с помощью ответ.ClearHeaders способ) в целях чтобы предотвратить кэширование сайтов на стороне клиента. Но этот метод очищает все заголовки, включая информацию о сеансе пользователя, и, следовательно, все данные во временном хранилище (которое я использовал позже в программе). Поэтому даже установка нового сеанса в событии Session_Start не помогла.
чтобы решить мою проблему, я гарантировал, что не удалю заголовки, когда произойдет перенаправление.
надеюсь, что это поможет кому-то.
я столкнулся с этой проблемой другим способом. Контроллеры, которые имели этот атрибут
[SessionState(SessionStateBehavior.ReadOnly)]
читали из другого сеанса, хотя я установил значение в исходном сеансе при запуске приложения. Я добавлял значение сеанса через _layout.cshtml (может быть, не самая лучшая идея?)Это было явно ReadOnly причиной проблемы, потому что когда я удалил атрибут, исходный сеанс (и SessionId) будет оставаться в такт. Исправлено использование решения Claudio/Microsoft оно.