Сохранить сеанс ASP.NET InProc при повторном запуске процесса W3WP (IIS)

Я понимаю, что все данные сеанса InProc всегда исчезают, когда процесс его владельца w3wp перезагружается, поскольку он находится только в памяти w3wp.

Мне было интересно, возможно ли кэшировать данные сеанса, когда переработка происходит где-то вне процесса, а затем повторно внедрить (и перестроить) сеанс, когда он возвращается. Таким образом, я получал бы скорость InProc с надежностью экстернализации, подобной состоянию сервера, когда это необходимо. Это возможно?

3 ответа

Решение

Нет, это невозможно. Не существует API для "разогрева" внутрипроцессного состояния сеанса или кэша. Такое решение было бы ненадежным в любом случае. Вы не могли гарантировать, что последнее, что сделает ваше приложение, - это экспортирует его текущее состояние сеанса, поэтому вы никогда не сможете рассчитывать на то, что импортированные данные будут текущими.

Вы можете использовать сервер состояний вне процесса на том же хосте, что и ваше веб-приложение. Тогда веб-приложение может свободно перерабатываться, сохраняя информацию о состоянии в целости и сохранности. Это немного быстрее, чем использование SQL Server для управления сеансами, так как вам не нужно иметь дело с накладными расходами SQL или сетевым транзитом на другую машину, единственный способ, который хуже, чем состояние сеанса в процессе, - это то, что данные должны маршал через границы процесса, но пока у вас нет огромного количества быстро меняющихся данных сеанса, это вообще не должно быть заметно.

Есть и другие альтернативы, такие как Microsoft Project с именем "Velocity" или SessionServer от ScaleOut Software (среди прочего, я уверен), которые предлагают механизмы распределенного кэширования, которые могут поддерживать синхронизацию состояния сеанса или кэша между серверами в ферме серверов без необходимости прибегать к использовать SQL Server.

Вопреки тому, что опубликовал другой пользователь, я бы НЕ использовал ViewState для хранения данных сеанса, если это вообще возможно. С одной стороны, это не истинное состояние сеанса, если пользователь перемещается назад или вперед, он может быть потерян. Во-вторых, это довольно небезопасно. В-третьих, это вызывает массовое раздувание страницы при злоупотреблении.

Может быть, вы можете хранить достаточно информации в файле cookie (или во ViewState), чтобы вы могли заново создать сеанс на основе этих данных в случае, если рабочий процесс был переработан.

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

Вы должны использовать SQL Server для состояния сеанса, если это ваше намерение. То, что вы хотите, это сеансы, которые можно восстановить после полного завершения процессов хоста. Ни inproc, ни stateserver не поддерживают, так как при выходе из строя они теряют все данные. Вы могли бы написать свой собственный метод состояния, но это было бы трудоемким. Вот инструкции, если вы хотите это сделать:

http://www.exforsys.com/tutorials/asp.net-2.0/asp.net-2.0-customizing-the-session-state-mechanism.html

Возможно, вы захотите вообще не использовать сеансы, а скорее полагаться на ViewState. Если у вас сайт с высоким трафиком, это хороший способ перенести нагрузку на клиентов.

Другие вопросы по тегам