2010-05-19 3 views
14

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

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

+8

Думаю, вам нужно изменить, как вы храните сеансы. Я считаю, что вам нужно перейти в хранилище на основе файлов или на основе sql. Я считаю, что вы в настоящее время храните их inproc, которые, я думаю, хранят их в пространстве памяти приложения. Не могу дать более подробную информацию, хотя, извините –

+1

@hamlin, что правильно –

+1

@hamlin, это достойно ответа. – roufamatic

ответ

5

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

Это приводит к удаленным сеансам и выходу из системы.

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

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

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

+0

Согласен, что это сеанс, и я понимаю, что я отвечаю так долго после вопроса orig (ну, хорошо). Мы столкнулись с проблемами с блокировкой состояния SQL Server с большими нагрузками на трафик. Мы закончили работу с Microsoft AppFabric Cache, что и использует MS Azure. До сих пор это было прочное решение для нас. – ctc

5

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

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

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

0

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

0

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

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

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

0

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

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

+0

Я тоже не уверен, но вам нужно будет сделать что-то явно, и это будет потенциальная проблема отказа. Возможно, это какая-то версия версий форм, поэтому в форме можно увидеть, публикует ли пользователь и устаревшая форма для обновленного кода. Во всяком случае, вам не о чем беспокоиться, если вы не можете использовать подход к файлу cookie в любом случае :) –

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