У меня есть веб-сайт в C#/ASP.NET, который в настоящее время находится в разработке. Когда мы работаем, я хотел бы сделать выпуски часто в течение дня, поскольку мы исправляем ошибки и добавляем опции (как это: http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/).
Если Вы загружаете новую версию сайта или даже изменяете единственный файл, он выгоняет пользователей, которые в настоящее время зарегистрированы, и заставляет их запуститься по любым формам и такому. Существует ли секрет к способности сделать развертывание, не вмешиваясь в пользователей для сайтов.NET?
Если вы вносите изменения в файл конфигурации, содержимое папки bin приложения или что-то подобное, рабочий процесс ASP.NET перезапускается вместе с вашим приложением.
Это приводит к удалению сеансов и исключению пользователей.
Решение состоит в том, чтобы использовать другие методы хранения сеанса, отличные от стандартного InProc
.
Этого можно добиться, установив режим состояния сеанса . Параметры SqlServer
и StateServer
обеспечивают очень хорошее решение вашей проблемы.
Режим SqlServer
относительно легко настроить, запустить и запустить. (По сути, это просто создание базы данных, запуск aspnet_regsql, а затем указание ее в конфигурации.) Если у вас нет MS SQL Server или вы не хотите его использовать, вы можете использовать StateServer
, или создайте собственного провайдера и используйте режим Пользовательский
.
Единственное ограничение заключается в том, что вы можете сохранять только сериализуемые значения в режиме SqlServer
и StateServer
.
Для этого есть две альтернативы:
В любом случае вы также получите гибкость, позволяющую запускать свое приложение на нескольких серверах. для производительности или отказоустойчивой кластеризации.
В зависимости от того, что вы храните в объекте Session, вы можете восстановить его в обработчике Global.asax's Session_Start. Я делал это во внутреннем приложении, где мы хранили в Session только идентификационные данные пользователя, поэтому мы могли просто использовать его cookie авторизации для воссоздания сессии.
Одна вещь, которую следует иметь в виду, если вы это сделаете: допустим, пользователь загружает форму, а затем уходит на обед, и вы обновляете страницу, пока его нет. Если они вернутся к своему столу и отправят форму, они отправят старую версию формы в новый code-behind.
Я предполагаю, что пользователей выкидывает из-за перезапуска процесса приложения веб-сервера. По умолчанию пользовательские сессии хранятся в памяти и данные сессии убиваются. Провайдер сессий является настраиваемым параметром в web.config. Возможно, выбор внешнего (вне процесса веб-приложения) провайдера сессий - это шаг к тому, чего вы ожидаете.
Причина, по которой вы это видите, заключается в том, что вы сбрасываете пул приложений, тем самым сбрасывая сеанс для всех.
Самый простой способ - разгрузить сеанс на сервере состояния сеанса или свести к минимуму использование сеанса.
Один из способов обойти это - если вы не можете разгрузить сеанс, - всегда выполнять развертывание в новом виртуальном каталоге. Затем ваш общедоступный URL-адрес просто перенаправляет на вашу последнюю версию. Все пользователи, которые уже вошли в систему, продолжат использовать старую версию, но любые новые пользователи будут использовать новую версию.