2

Прошу прощения, если это было задано раньше, но я не нашел конкретного вопроса, который у меня есть в голове.Альтернативы использованию переменных сеанса в ASP.NET (включая MVC)

Для веб-сайта, который я создаю (с использованием ASP.NET MVC) - производительность - важная функция. Кроме того, есть вероятность, что сайт может быть размещен в среде, в которой пул приложений будет перерабатываться каждые 20 минут (или раньше, если достигнут порог памяти). Я бы хотел быть полностью независимым от использования переменных сеанса и вместо этого сохранить в файле cookie значение, подобное GUID. Мое рассуждение - я не знаю, как долго сессия будет продолжаться из-за утилизации AppPool и не хочет, чтобы их сеанс был тайм-аут досрочно и заставил их повторно вводить логин.

Значение GUID в файле cookie будет действовать как ключ поиска к таблице, в которой я храню информацию, относящуюся к сеансу (значение идентификатора пользователя и т. Д.). Поэтому, если мне нужны эти данные, я мог бы получить их из базы данных. Я бы все же использовал событие Session_OnEnd, чтобы очистить эту таблицу сеансов строк со значением «последнего действия» более 20 минут (или, как правило, длинные сеансы для последнего). Поэтому я предполагаю, что все равно буду использовать состояние сеанса, а не переменные сеанса.

Моя забота, опять же, о производительности. Поэтому мне было любопытно, есть ли какие-либо более эффективные способы избежать использования переменных сеанса, сохраняя при этом возможность знать, что такое пользователь, и управлять их посещением сайта «сеансовым» способом. Я все еще новичок в MVC, но имею много опыта работы в ASP.NET на протяжении многих лет, поэтому, надеюсь, мой вопрос имеет смысл!

EDIT: Я как бы отстраняюсь от желания использовать SQL Session State, потому что я, скорее всего, буду в среде с общим сервером sql server и не думаю, что у меня будет логин с возможностью создавать/запускать задания если необходимо для удаления устаревших данных сеанса sql и т. д. Существуют ли какие-либо реальные недостатки в зависимости от Session_OnEnd с файлом cookie в сценарии утилизации AppPool? Может ли Session_OnEnd не выполняться для сеансов, которые являются текущими при повторном использовании AppPool?

ответ

5

Вы полагаете Сессии сохраняются только в рабочем процессе, вы можете иметь SQL государственных сеансов, check this link before going any further

+1

В противном случае известных как SQL и Cookies. – madcolor

+0

+1: вам не нужно катить свою собственную базу данных, если вы переходите с постоянством состояния SQL –

+0

http://www.dbazine.com/sql/sql-articles/cook9 – madcolor

1

Использование базы данных для обеспечения «прочного» сохранение через веб-ферм/садов является общей техникой. Также есть distributed caching systems, которые могут использоваться для предоставления данных состояния сеанса на всех серверах и перезагрузки.

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

1

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

Так почему бы не сохранить состояние сеанса в БД? Для этого есть встроенная поддержка, и она эффективно решает проблему рециркуляции, сохраняя при этом приемлемую производительность, если состояние сеанса остается небольшим.

+0

«Состояние сеанса невелика» - каково ваше определение? Число переменных сеанса меньше 2? 10? – jamauss

+0

Не абсолютное число, а их тип. Когда они не выполняются, они должны быть сериализуемыми, поэтому вы должны обратить внимание на то, что сериализованный граф объектов невелик. – Lucero

+0

Я бы использовал только простые типы - String, DateTime, Int и т. Д. Какие все сериализуемые типы, не так ли? – jamauss

0

Посмотрите на пользовательский механизм кеширования. Как вы сказали, вы не можете использовать переменные сеанса, так как кажется, что ваш веб-сайт будет сбалансирован с нагрузкой? Сессии могут измениться из-за утилизации из пула приложений. Вы также не хотите, чтобы над головой View State (вы могли использовать это, но это повлияло бы на производительность).

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

  1. Кэширования потокобезопасно
  2. Элементов в кэше удаляются автоматически
  3. элементов в зависимости поддержки кэша
Смежные вопросы