Непрерывное развертывание на веб-сайте ASP.NET? - PullRequest
14 голосов
/ 19 мая 2010

У меня есть веб-сайт на C # / ASP.NET, который в настоящее время находится в разработке. Когда мы находимся в производстве, я хотел бы делать выпуски часто в течение дня, так как мы исправляем ошибки и добавляем функции (например: http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/).

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

Ответы [ 5 ]

5 голосов
/ 19 мая 2010

Если вы вносите изменения в файл конфигурации, содержимое папки bin приложения или тому подобное, рабочий процесс ASP.NET перезапускается вместе с вашим приложением.

Это приводит к удалению сеансов и удалению пользователей.

Решение состоит в том, чтобы использовать другие методы хранения сеансов, отличные от значения по умолчанию InProc.
Вы можете достичь этого, установив режим * сеанса 1008 *. Опции SqlServer и StateServer обеспечивают очень хорошее решение для вашей проблемы.

Режим

SqlServer относительно прост в настройке и запуске. (По сути, это просто создание базы данных, запуск aspnet_regsql, а затем указание ее в конфигурации.) Если у вас нет MS SQL Server или вы не хотите его использовать, вы можете использовать StateServer или создать собственную и используйте режим Custom.

Единственное ограничение заключается в том, что вы можете хранить сериализуемые значения только в режимах SqlServer и StateServer.

5 голосов
/ 19 мая 2010

Причина, по которой вы это видите, в том, что вы сбрасываете пул приложений, тем самым сбрасывая все сеансы.

Самым чистым маршрутом будет разгрузка вашего сеанса на сервер состояний сеанса или минимизация использования вами сеанса.

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

0 голосов
/ 19 мая 2010

В зависимости от того, что вы храните в объекте Session, вы можете восстановить его в обработчике Session_Start Global.asax. Раньше я делал это во внутреннем приложении, где мы действительно сохраняли личность пользователя в сеансе, поэтому мы могли просто использовать их файл авторизации для воссоздания сеанса.

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

0 голосов
/ 19 мая 2010

Есть две альтернативы для достижения этой цели:

  1. Не использовать сессию вообще. (Вы можете использовать куки для аутентификации)
  2. Использовать другой режим состояния сеанса. Государственный сервер или SQLServer. http://msdn.microsoft.com/en-us/library/ms178586(v=VS.80).aspx

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

0 голосов
/ 19 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...