Сохранять сеанс ASP.NET InProc при повторном запуске процесса W3WP (IIS) - PullRequest
2 голосов
/ 19 сентября 2009

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

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

Ответы [ 3 ]

2 голосов
/ 22 сентября 2009

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

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

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

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

0 голосов
/ 22 сентября 2009

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

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

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

0 голосов
/ 22 сентября 2009

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

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

...