Непрерывное развертывание с веб-сайтом 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
Есть две альтернативы для достижения этого:
В любом случае вы также получите гибкость, чтобы иметь возможность запускать приложение на нескольких серверах для обеспечения производительности или отказоустойчивой кластеризации.
Ответ 5
В зависимости от того, что вы храните в объекте Session, вы можете восстановить его в обработчике Global.asax Session_Start. Я делал это во внутреннем приложении, где мы действительно сохраняли идентификатор пользователя в сеансе, поэтому мы могли просто использовать их cookie авторизации для воссоздания сеанса.
Одна вещь, о которой следует помнить, если вы это сделаете: скажите, что пользователь загружает форму, а затем отправляется на обед, и вы обновляете эту страницу, пока они находятся вдали. Если они вернутся на свой рабочий стол и отправят форму, они отправят старую версию формы в новый код.