, используя этот код
Response.Redirect(resp.RedirectUrl, false);
Context.ApplicationInstance.CompleteRequest();
, вы позволяете запускать свой сайт и другой код (остальное на линиях и остальное на событиях жизненного цикла страницы), которые, вероятно, не проверяются (потому что вы верьте, что это не запускается и не перенаправляется) или может иметь некоторые значения, а вы получаете исключения - в коде, который выполняется до фактического перенаправления.
Попробуйте использовать этот код, который остановит дальнейшее выполнение вашей программы
Response.Redirect(resp.RedirectUrl, false);
return;
с тем, что вы получаете исключение ThreadAbortException
, но вам нужно остановить дальнейший запуск вашей программы с контролируемой остановкой.
relative Перенаправить на страницу с помощью endResponse для истинного VS CompleteRequest и защитного потока
Я соглашаюсь с больше подхода качелей, чем прокручивающийся подход, который Вы ищете. Проблема состоит в том, что Вы заканчиваете в ситуациях, где выравнивание нагрузки может бросить пользователей назад и вперед между различными версиями приложения, в то время как Вы переходите.
Решения, которые мы предложили (прежде чем, находя SeeSaw, который мы не используем) состояли в том, чтобы вывести половину полукровок из эксплуатации от подсистемы балансировки нагрузки. Завершите работу их. Обновите их. Запустите их. Отложите тех полукровок онлайн в подсистеме балансировки нагрузки и снимите другую половину. Завершите работу второй половины. Обновите вторую половину. Запустите их. Это значительно минимизирует время, где у Вас есть две различных версии приложения, работающего одновременно. Я записал bat-файл окон, чтобы сделать это. (Развертывающийся в Windows не рекомендуется, btw),
Очень важно отметить, что наличие миграций базы данных может сделать целый подход немного опасным. Если у Вас есть только аддитивные миграции, можно выполнить их в любое время перед развертыванием. При удалении столбцов необходимо сделать это после развертывания. При переименовании столбцов лучше разделить его на создавание новых данных столбца и копии в него миграция для выполнения перед развертыванием и отдельным сценарием для удаления старого столбца после развертывания. На самом деле может быть опасно использовать Ваши регулярные миграции на производственной базе данных в целом, если Вы не прилагаете определенное усилие для организации их. Все это указывает на произведение более частых поставок, таким образом, каждое обновление является более низким риском и менее сложный, но это - предмет для другого ответа.
Качели являются драгоценным камнем, найденным в направляющих Океания Проект Rubyforge, который обеспечивает этот вид функциональности к кластерам полукровки. Однако проект может страдать от некоторой разрядной гнили не havain, имел выпуск с 2007. Все еще стоящий взгляда даже только для зажимания идей :)
#!/bin/bash
for PIDFILE in /tmp/mongrel.*; do
PID=$(cat ${PIDFILE})
kill ${PID}
${RUN_MONGREL_CMD} ${PID}
sleep 2
done