Непрерывное развертывание с веб-сайтом ASP.NET?

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

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

Ответы

Ответ 1

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

В результате удаляются сеансы и выходят из системы.

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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