2009-09-19 4 views
2

Я понимаю, что все данные сеанса InProc всегда исчезают, когда процесс владельца w3wp перерабатывается, поскольку он только находится в памяти w3wp.Сохранять сеанс ASP.NET InProc, когда процессы обработки W3WP (IIS)

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

ответ

2

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

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

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

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

0

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

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

+0

это не сработает. Максимальный размер файла cookie составляет около 4 тыс. Cookies также являются очень неэффективным и небезопасным способом перемещения данных вперед и назад. –

+0

Да, но, возможно, вам нужно сохранить только некоторые идентификаторы в этом файле cookie (например, идентификатор пользователя, текущую страницу и т. Д.) И, при необходимости, восстановить оставшуюся часть сеанса из базы данных. – M4N

0

Вы должны использовать 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

Неплохая идея раздуть страницу с помощью ViewState для хранения информации о сеансе. –

+0

У меня есть сайты с несколькими тысячами одновременных пользователей. Для сайтов высокого спроса ViewState - отличный способ снизить нагрузку на сервер. –

+0

Я не уверен в вашем комментарии, если вы действительно прочитали мое сообщение. –

Смежные вопросы