Сохранить ASP.NET Сеанс InProc, когда процесс W3WP (IIS) повторяет

StackOverflow https://stackoverflow.com/questions/1448367

Вопрос

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

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

Это было полезно?

Решение

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

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

Существуют также другие альтернативы, такие как Проект Microsoft с кодовым названием "Velocity" или Сервер сеансов масштабируемого программного обеспечения (среди прочих, я уверен), которые предлагают механизмы распределенного кэширования, которые могут синхронизировать состояние сеанса или кэш между серверами в ферме серверов, не прибегая к использованию 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.Если у вас сайт с высокой посещаемостью, это хороший способ переложить нагрузку на клиентов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top