Повторная публикация веб-приложения ASP.NET при работающем сайте - PullRequest
6 голосов
/ 14 марта 2009

Я пытаюсь понять, как обрабатывать обновления работающего, работающего приложения ASP.NET (2.0 или выше), пока на сайте есть пользователи.

Например, предположим, что SO - это проект веб-приложения ASP.NET. Код проекта компилируется в один файл .DLL в папке BIN. Теперь на SO постоянно есть пользователи, так что бы случилось с действиями / сессиями пользователей, если бы вы использовали функцию «Опубликовать» в Visual Studio .NET (или просто снова все FTP), когда они используют сайт?

Будет ли создание веб-сайта ASP.NET облегчать любые проблемы, которые могут существовать или не существовать в описанном выше сценарии? Я начинаю разрабатывать веб-сайт как веб-приложение, управляемое пользователями, и хочу убедиться, что моя неопытность в этом отношении потенциально не раздражает [потенциально] многих пользователей, которых я [хочу] иметь 24/7.

РЕДАКТИРОВАТЬ: Извините, я должен был поставить это в более точном контексте. Предположим, что этот сайт размещен на веб-хостинге с ежемесячной платой. Я не буду управлять самим сервером, только тем, что веб-хостинг разрешает как пользователю их услуг.

Ответы [ 6 ]

5 голосов
/ 14 марта 2009

Я создаю два веб-сайта в IIS. Одним из них является производственный веб-сайт, а другим - статический веб-сайт с HttpHandler, который отправляет все запросы на одну статическую HTML-страницу «Мы обновляем», обслуживаемую службой HTTP 503 «Недоступно». Как правило, веб-сайт обновления отключен. Когда пришло время для обновления, мы останавливаем производственный веб-сайт, запускаем веб-сайт обновления, и теперь мы можем работать с производственным веб-сайтом, как нам угодно, не беспокоясь о блокировке DLL или о необходимости остановки рабочих процессов.

Я начал это делать, потому что

  • App_Offline.htm действительно плохо работает в веб-садах, которые мы используем.
  • App_Offline.htm обслуживает свою страницу как 404, что плохо, если вы не работаете в течение значимого периода времени.
  • Мы можем запустить обновленный производственный веб-сайт с измененными настройками (только прослушивание на локальном хосте), где мы можем в последнюю минуту принять / проверить, что все работает, прежде чем мы щелкнем выключателем, выключим веб-сайт обновления и снова - включение производственного веб-сайта.

Вещи, которые это не решает, включают

  • Любое обслуживание, которое требует перезагрузки сервера - у вас все еще есть время простоя, когда ни одна страница не обслуживается.
  • Любое обслуживание, которое мешает работе среды .NET, например, обновление до последнего пакета обновления.

Другие подходы, которые я видел, включают

  • Наличие двух серверов. Отправьте все запросы балансировки нагрузки на один сервер, обновите другой; затем промыть и повторить. У большинства из нас нет такой роскоши.
  • Создание нескольких каталогов bin, например bin-1.0.0.0 и bin-1.1.0.0, и указание ASP.NET, какой каталог bin использовать в файле web.config. (Одним из преимуществ этого является то, что возврат к предыдущему двоичному файлу - это просто редактирование файла конфигурации. Недостатком является то, что труднее вернуть ресурсы, которые не попадают в ваши двоичные файлы, такие как шаблоны и изображения и т. Д.) помните, как это на самом деле работало - я думаю, что приложение выполняло некоторую позднюю загрузку сборки в своем Global.asax на основе своего собственного раздела web.config (так как вы коснулись web.config, приложение перезапустилось, так что все было в порядке).

Если найдешь лучший способ, дай мне знать!

4 голосов
/ 19 марта 2009

Изменение модели веб-сайта asp.net не окажет никакого влияния, так как также произойдет переработка, некоторые изменения, которые ее инициируют наверняка: web.config, global.asax, app_code.

После перезагрузки пользователь все равно будет авторизован, потому что asp.net просто проверит синтаксис. Это означает, что вы используете фиксированный машинный ключ, иначе он будет меняться при каждом повторном использовании. Это то, что вы хотите сделать в любом случае, так как другие вещи могут сломаться, если ключ меняется между запросами, то есть проверка состояния представления, встроенные ресурсы (дешифрование URL-адреса не выполняется).

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

1 голос
/ 14 марта 2009

App_offline.htm , я думаю, является отличным решением для этого.

в SO мы видим страницу, в настоящее время недоступную приложению, когда начинается развертывание.

1 голос
/ 14 марта 2009

Одним из решений может быть развертывание приложения в среде с балансировкой нагрузки (веб-ферма).
При развертывании новой версии вы должны использовать балансировщик нагрузки для перенаправления запросов на сервер, на который вы не развертываете.

0 голосов
/ 19 марта 2009

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

0 голосов
/ 14 марта 2009

Я не уверен, как ТАК справляется с этим .. Но мы обычно помещаем промежуточную страницу. Поэтому то, что пользователь когда-либо делал (добавляя вопрос или отвечая на вопросы), не обновляется. Как только он что-то обновит, он увидит страницу с просьбой попробовать через некоторое время.

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

Некоторое использование сайта используется в кластерной среде, поэтому я отключаю один сервер и сообщаю балансировщику нагрузки, что он не будет доступен, и как только я проверяю, что новая версия работает нормально, я запускаю ее. Я делаю то же самое вещь для следующего сервера.

Есть ли у нас другой вариант?

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