Как определить, что запуск приложения не удался?
Наша ситуация:
У нас есть несколько веб-серверов за loabalancer (Astaro Security Gateway). На веб-серверах мы запускаем приложение asp.net, и у нас есть клиентские страницы, настроенные для 404 и 500 кодов состояния.
Теперь, когда приложение не запускается, каждый запрос перенаправляется на страницу ошибок путем отправки кода состояния 302, а сама страница ошибок затем отправляет 500.
Loadbalancer отправляет запрос HEAD нашим веб-серверам каждые 15 секунд, чтобы проверить, жив ли он, и если да, то проверяет первый код состояния html. Таким образом, он видит только 302. Каждый код ниже 500 рассматривается как работающий сервер.
Вопрос:
Как мы можем заставить нашу балансировку нагрузки работать, если приложение не запустилось?
Редактировать:
Под приложением не удалось запуститься, я имею в виду, что при запуске были ошибки. Некоторые важные части не могут быть инициализированы, и поэтому каждая страница не может быть выполнена.
1 ответ
Пара способов:
В вашем файле web.config в режиме customErrors установите redirectMode
в ResponseRewrite
- это удаляет перенаправление 302 с сервера на страницу с ошибкой - здесь также есть счастливое совпадение: пользователи могут легко увидеть, какой была оригинальная страница, которую они запрашивали, и могут повторить попытку с F5, если это может решить проблему.
Если вы подключаетесь к событию ApplicationError, убедитесь, что вместо перенаправления на страницы ошибок вы используете Server.Transfer
вместо.
У меня есть следующее в одном из моих web.configs:
<customErrors mode="On"
defaultRedirect="ErrorHandler.aspx"
redirectMode="ResponseRewrite">
Затем на своей странице ErrorHandler я проверяю последнюю ошибку с сервера и настраиваю:
var serverError = Server.GetLastError();
var error = serverError as HttpException;
int errorCode;
string errorMessage;
if (null != error)
{
errorCode = error.GetHttpCode();
errorMessage = error.GetHtmlErrorMessage();
}
else
{
errorCode = 404;
errorMessage = "Page not found";
}
Response.StatusCode = errorCode;
Response.StatusDescription = errorMessage;
Очевидно, что вы, возможно, захотите выполнить дополнительную обработку - например, прежде чем я сделаю все это, я сравниваю исходный запрос с моей базой данных Redirects для проверки перемещенных URL-адресов содержимого / тщеславия и возвращаюсь к этому, только если не смог найти подходящий перенаправления.