ASP.NET случайно теряет значения сеанса - PullRequest
7 голосов
/ 05 августа 2011

Я довольно долго искал ответы на этот вопрос, поскольку он продолжает мучить меня.Мы храним данные для входа в систему и другие данные о текущих действиях пользователя в Session State (InProc).Время от времени я получаю исключение Null Reference, пытающееся использовать одну из переменных сеанса.Это происходит на случайных страницах со случайными переменными сеанса.Я изменил теги web.config httpRuntime и compation, чтобы предотвратить перезапуск appPool:

<httpRuntime requestValidationMode="2.0" waitChangeNotification="86400" maxWaitChangeNotification="86400" />
<compilation debug="False" strict="false" explicit="true" targetFramework="4.0" numRecompilesBeforeAppRestart="1000" />

Я настроил IIS для перезапуска пула приложений в 3 часа ночи, чтобы он не перезапускался, когда люди заняты использованием сервера.И я регистрирую перезапуски пула приложений в журнале событий, чтобы убедиться, что я знаю, когда это происходит.

Dim runtime As HttpRuntime = GetType(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.GetField, Nothing, Nothing, Nothing)
Dim shutDownMessage As String = runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)

Dim shutDownStack As String = runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)
Dim evtSource As String = "ASP.NET"
Dim log As New EventLog
log.Source = evtSource
log.WriteEntry(String.Format("_shutDownMessage={0}{2}_shutDownStack={1}", shutDownMessage, shutDownStack, vbCrLf & vbCrLf), EventLogEntryType.Warning)

Я получаю записи журнала событий при перезапуске пула приложений.Пул приложений НЕ перезапускается при возникновении этих ошибок.

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

У меня была эта проблема на Windows Server 2003 (32-разрядной), работающей под управлением IIS6 с 32-разрядной .NET 3.5 и 4 ГБ памяти. В рамках обновления нашего сервера около года назад мы получили новый веб-сервер - Windows Server 2008 (64-разрядная)) работает IIS 7 с 16 ГБ памяти.Я обновил сайт до .NET 4.0 64bit.Все еще возникают те же проблемы на новой машине (обычно 1-3 раза в день - в случайное время в течение дня).

Я не могу сделать это в своей отладке из-за ее случайного характера, но я верю,это происходит случайным образом в нашей среде разработки.Сервер разработчика имеет практически те же характеристики, что и рабочий.
Обе среды изолированы и работают как один веб-сервер, а не как часть веб-фермы.

Я думаю, что я могу попробоватьреализовать State Server для выхода из режима InProc, но это всего лишь еще один удар в темноте.
Кроме попыток использования State Server, могу ли я что-то еще сделать, чтобы определить, когда это произойдет или предотвратить это?

Ответы [ 6 ]

7 голосов
/ 09 апреля 2012

Для тех, кто заинтересован или имеет дело с подобными проблемами, я хотел бы выяснить причину моей проблемы здесь.

Я реализовал NCache сервер состояний вне процесса для кэша приложений и состояния сеанса около 7 или 8 месяцев назад. К сожалению, удаление сеанса вне процесса не повлияло на мою проблему потери случайных переменных сеанса при выборе отчета на моем сайте. И, поскольку мне не удалось воспроизвести эту проблему, я не прикладывал больше усилий, чтобы попытаться ее исправить, до недавнего времени, когда из-за другой проблемы в моей голове погас свет.

Чтобы добраться до сути - я не переписывал переменные сеанса где-то, чего я не осознавал, но проблема заключалась в том, что пользователь открывал вторую (или третью) вкладку, чтобы сравнить параметры выбора отчета рядом. У нас есть несколько настраиваемых отчетов, в которых пользователь может выбрать несколько параметров для создания настраиваемых отчетов (представьте, что это элемент управления мастера, в котором есть несколько шагов для создания настраиваемого отчета). Если пользователь находится на шаге 3 из 5, а затем открывает новую вкладку и начинает снова проходить процесс выбора отчета, новые выборки перезаписывают старые выборки, поскольку две вкладки совместно используют один и тот же сеанс. Я подтвердил, что это так, открыв несколько вкладок и пройдя процесс выбора.

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

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

НТН

7 голосов
/ 05 августа 2011

, если ваше веб-приложение развернуто на ферме серверов (более одного веб-сервера) Как вы сказали, вы используете сеанс InProc, и может случиться, что пользователь перенаправляется на сервер, отличный от того, на котором он был сохранен в этой переменной сеанса. В этом случае вы должны пойти на сеанс out of proc, как вы упомянули (Session State Server)

если вы выбираете State Server, помните о нижеследующем, чтобы предотвратить любую другую проблему:

Поскольку Stateserver объединяет идентификатор сеанса ASP.NET с IIS путь к приложению для создания уникального ключа, сеансы, выданные для одного из пять новых сетей не могли быть найдены при доступе через один из другие сети, что явно крайне неудачно в взвешенном круговая веб-ферма с балансировкой нагрузки

http://www -jo.se / f.pfleger / сессии потерял

также посмотрите на этот регистратор, чтобы понять, будет ли приложение перезагружаться против вашей воли:

http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

1 голос
/ 22 ноября 2013

Я столкнулся с этой проблемой, потому что наш сервер был настроен для запуска https. Сессии не будут сохранены, если я буду работать под простым http. Тем не менее, сеансы были сохранены при работе по https. Поэтому мы настроили правило перезаписи URL-адреса, чтобы приложение всегда отправлялось по адресу https, если оно пришло через http.

Кроме того, сеансы не будут работать локально или на сервере, если вы не запускаете https (обратите внимание на символ S в конце https), если в вашем файле web.config есть следующее:

<httpCookies httpOnlyCookies="true" requireSSL="true"/>
1 голос
/ 05 августа 2011

Проблемы с сеансом, с которыми вы сталкиваетесь, могут возникать по нескольким причинам

  1. Истечение срока сеанса: поскольку вы используете режим Inproc, сеансы действительны только в течение периода времени ожидания сеанса.что составляет 20 минут по умолчанию.попробуйте использовать тег sessionstate в разделе system.web вашего веб-файла .config и установите значение тайм-аута на большее значение.

  2. Другая проблема может быть связана с веб-фермами и веб-садами.если вы настроили веб-фермы и веб-сад для своего веб-сайта.Совместное использование сеансов Inproc может вызвать проблемы.

  3. Процесс перезапускается: процесс w3p вашего сайта перезапускается из-за некоторых проблем в коде.или утечки памяти.

0 голосов
/ 15 июня 2016

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

Я столкнулся с ситуацией, когда IE и Chrome также случайно сбрасывали переменные сеанса. Я искал и искал, и все говорили обычные вещи ... проверьте доменное имя, проверьте настройки IIS для куки ... и т. Д.

Моя проблема оказалась разрешением.

В моем web.config у меня есть запись разрешения для «публичной» папки, доступ к которой может получить неаутентифицированный пользователь.

<location path="public">
<system.web>
  <authorization>
    <allow users="*" />
    <allow users="?" />
  </authorization>
</system.web>

Проблема заключалась в публичном вызове .js HttpHandler, который НЕ был публичным. Пытаясь повторно использовать код, я указал как на защищенную, так и на открытую сторону на код в защищенной части. Полагаю, что побочным эффектом было завершение сеанса без очень значимого сообщения об ошибке.

Я могу добавить еще одну запись только для этого обработчика, или я могу сделать общедоступную и защищенную копию этого кода (менее желательный подход).

0 голосов
/ 09 октября 2014

Есть еще одно условие, когда сессии могут потерять свое значение.

Вы можете использовать инструмент Fiddler, чтобы отследить эту проблему.

Наибольшее условие может быть найдено, когда какой-то элемент, например источник, не найден в решении. В этот момент сервер попытается перезагрузить этот необоснованный или потерянный объект, перезапустив проект. Перезапуск проекта приведет к сбросу всех объектов сеанса.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...