Потеря состояния сеанса - PullRequest
54 голосов
/ 18 августа 2010

У меня есть приложение ASP.net, где пользователи не могут успешно выполнить определенные действия, потому что, как я полагаю, причины могут быть связаны только с потерей их сеанса (именно здесь я сохраняю их текущую информацию о пользователе как определить, вошли ли они в систему)

Я в недоумении, почему они потеряют свою сессию, поэтому мой первый вопрос:

Что (в целом) может привести к потере пользователем сеанса в ASP.net?

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

Как я могу отслеживать, когда мой пользователь теряет свою сессию

Ниже моя конфигурация sessionState для справки

<sessionState
           mode="InProc"
           cookieless="false"
           cookieName="My.Site.Com"
           timeout="480"/>

Ответы [ 8 ]

103 голосов
/ 18 августа 2010

Некоторые вещи могут привести к таинственному исчезновению состояния сеанса.

  1. Ваш тайм-аут сессииState истек
  2. Вы обновляете свой файл web.config или другой тип файла, который приводит к перезагрузке вашего домена приложений
  3. Ваш AppPool в IIS перезагружается
  4. Вы обновляете свой сайт большим количеством файлов, а ASP.NET активно разрушает ваш домен приложений для перекомпиляции и сохранения памяти.

-

Если вы используете IIS 7 или 7.5, вот несколько вещей, которые нужно искать:

  1. По умолчанию IIS устанавливает AppPools на отключение после определенного периода бездействия.
  2. По умолчанию IIS устанавливает перезапуск AppPools каждые 1740 минут (очевидно, в зависимости от вашей корневой конфигурации, но это по умолчанию)
  3. В IIS проверьте «Расширенные настройки» вашего AppPool. В нем есть свойство под названием «Idle Time-out». Установите его на ноль или на большее число, чем значение по умолчанию (20).
  4. В IIS проверьте настройки «Переработка» вашего AppPool. Здесь вы можете включить или отключить AppPool от переработки. 2-я страница мастера - это способ регистрации в журнале событий каждого типа отключенного AppPool.

Если вы используете IIS 6, применяются те же настройки (по большей части, но с разными способами доступа к ним), однако получение их для регистрации повторов является более сложной задачей. Вот ссылка на способ получения IIS 6 для регистрации событий перезапуска AppPool:

http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/

-

Если вы обновляете файлы в своем веб-приложении, следует ожидать, что весь сеанс будет потерян. Это просто природа зверя. Однако вы можете не ожидать, что это произойдет несколько раз. Если вы обновите 15 или более файлов (aspx, dll и т. Д.), Существует вероятность, что у вас будет многократный перезапуск в течение определенного периода времени, поскольку эти страницы перекомпилируются пользователями, обращающимися к сайту. Смотрите эти две ссылки:

http://support.microsoft.com/kb/319947

http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx

Установка большего значения для numCompilesBeforeAppRestart (или отскок вашего AppPool вручную) устранит эту проблему.

-

Вы всегда можете обработать Application_SessionStart и Application_SessionEnd, чтобы получать уведомления при создании или завершении сеанса. Класс HttpSessionState также имеет свойство IsNewSession , которое можно проверить на любом запросе страницы, чтобы определить, создается ли новый сеанс для активного пользователя.

-

Наконец, если это возможно в ваших обстоятельствах, я успешно использовал режим сеанса SQL Server . Не рекомендуется, если вы храните в нем большой объем данных (каждый запрос загружает и сохраняет полный объем данных из SQL Server), и это может быть затруднительно, если вы помещаете в него пользовательские объекты (поскольку они должны быть сериализуемыми) ), но это помогло мне в сценарии общего хостинга, где я не мог настроить свой AppPool так, чтобы он не перерабатывал пару часов. В моем случае я хранил ограниченную информацию, и это не оказывало негативного влияния на производительность. Добавьте к этому тот факт, что существующий пользователь будет повторно использовать свой SessionID по умолчанию, и мои пользователи никогда не замечали тот факт, что их сеанс в памяти был отброшен при перезапуске AppPool, поскольку все его состояние было сохранено в SQL Server.

2 голосов
/ 17 мая 2017

В моем случае помогла установка AppPool-> AdvancedSettings-> Maximum Worker Processes до 1

2 голосов
/ 16 мая 2014

У меня была ситуация в ASP.NET 4.0, когда мой сеанс сбрасывался при каждом запросе страницы (и мой код SESSION_START запускался при каждом запросе страницы).Это не случалось с каждым пользователем для каждой сессии, но обычно это происходило, и когда это происходило, это происходило при каждом запросе страницы.

Мой тег sessionState web.config имел те же настройки, что и упомянутыйвыше.

cookieless="false"

Когда я изменил его на следующее ...

cookieless="UseCookies"

... проблема, казалось, ушла.Видимо true | false были старые варианты из ASP.NET 1. Начиная с ASP.Net 2.0, перечисленные варианты стали доступны.Я думаю, что эти варианты устарели.«Ложное» значение никогда не представляло проблемы в прошлом - я заметил только в ASP.NET 4.0.Я не знаю, изменилось ли что-то в 4.0, что больше не поддерживает это правильно.

Кроме того, я только недавно узнал об этом.Так как проблема была неустойчивой раньше, я думаю, что я все еще мог столкнуться с ней, но пока она работает с этим новым параметром.

1 голос
/ 11 марта 2014

Ваш сеанс потерян, потому что ...

Я обнаружил сценарий, в котором сеанс потерян. На странице asp.net поле текстового поля суммы содержит недопустимые символы, после чего следует поиск переменной сеанса для других целей. После публикации анализа недопустимого числа через Convert. ToInt32 или double вызывает первое случайное исключение, но ошибка не отображается в этой строке. Вместо этого, Session, являющийся нулевым из-за необработанного исключения, показывает ошибку при извлечении сеанса, таким образом обманывая отладку ...

СОВЕТ: протестируйте свою систему, чтобы она не сработала - ДЕСТРУКТИВНО ... введите достаточно мусора в несвязанных сценариях для примера: после показа результатов поиска введите мусор в критерии поиска и перейдите к деталям результата поиска ..., вы сможете воспроизвести это машина на вашей локальной кодовой базе тоже ...:)

Надеюсь, что это помогает, Hydtechie

0 голосов
/ 15 мая 2019

Не знаю, связано ли это с вашей проблемой или нет, НО Windows 2008 Server R2 или SP2 изменили свои настройки IIS, что приводит к проблеме при сохранении сеанса.По умолчанию он управляет отдельной переменной сеанса для HTTP и HTTPS.Когда переменные установлены в HTTPS, они будут доступны только на страницах HTTPS при переключении.

Для решения этой проблемы есть настройка IIS.В диспетчере IIS откройте свойства ASP, разверните Свойства сеанса и измените Новый идентификатор для защищенного соединения на Ложь .

0 голосов
/ 19 декабря 2017

Возникла проблема в IIS 8 при получении содержимого через Ajax.Проблема заключалась в том, что MaximumWorkerProcesses было установлено на 2, и Javascript открыл 17 одновременных запросов.Это было больше, чем мог обработать AppPool, и был открыт новый пул (без данных авторизации).

Решение было изменить MaximumWorkerProcesses на 0 в IIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcesses.

0 голосов
/ 11 августа 2016

Я только терял сеанс, который был не строкой или целым числом, а датаровым.Помещение данных в сериализуемый объект и сохранение их в сеансе сработало для меня.

0 голосов
/ 18 августа 2010

Вы можете добавить некоторые записи в Global.asax в Session_Start и Application_Start, чтобы отслеживать, что происходит с сеансом пользователя и приложением в целом.

Кроме того, следите за тем, чтобы вы работали в ИнтернетеРежим фермы (несколько потоков IIS, определенных в пуле приложений) или балансировка нагрузки, поскольку пользователь может в конечном итоге подключиться к другому серверу, на котором нет той же памяти.В этом случае вы можете переключить режим сеанса на SQL Server.

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